Các delete
nhà điều hành được sử dụng để loại bỏ các thuộc tính từ các đối tượng.
const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false
Lưu ý rằng, đối với mảng, điều này không giống như loại bỏ một phần tử . Để loại bỏ một phần tử khỏi một mảng, sử dụng Array#splice
hoặc Array#pop
. Ví dụ:
arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]
Chi tiết
delete
trong JavaScript có một chức năng khác với từ khóa trong C và C ++: nó không trực tiếp giải phóng bộ nhớ. Thay vào đó, mục đích duy nhất của nó là loại bỏ các thuộc tính khỏi các đối tượng.
Đối với mảng, xóa một thuộc tính tương ứng với một chỉ mục, sẽ tạo ra một mảng thưa thớt (tức là một mảng có "lỗ" trong đó). Hầu hết các trình duyệt đại diện cho các chỉ số mảng bị thiếu này là "trống".
var array = [0, 1, 2, 3]
delete array[2] // [0, 1, empty, 3]
Lưu ý rằng delete
không di chuyển array[3]
vào array[2]
.
Các hàm dựng sẵn khác nhau trong JavaScript xử lý các mảng thưa thớt khác nhau.
for...in
sẽ bỏ qua chỉ số trống hoàn toàn.
Một for
vòng lặp truyền thống sẽ trả về undefined
giá trị tại chỉ mục.
Bất kỳ phương pháp sử dụng Symbol.iterator
sẽ trả về undefined
giá trị tại chỉ mục.
forEach
, map
và reduce
đơn giản là sẽ bỏ qua chỉ số còn thiếu.
Vì vậy, delete
toán tử không nên được sử dụng cho trường hợp sử dụng chung để loại bỏ các phần tử khỏi một mảng. Mảng có một phương pháp chuyên dụng để loại bỏ các phần tử và phân bổ lại bộ nhớ: Array#splice()
và Array#pop
.
Mảng # splice (bắt đầu [, xóaCount [, item1 [, item2 [, ...]]]])
Array#splice
làm thay đổi mảng và trả về bất kỳ chỉ số bị loại bỏ nào. deleteCount
các phần tử được xóa khỏi chỉ mục start
và item1, item2... itemN
được chèn vào mảng từ chỉ mục start
. Nếu deleteCount
được bỏ qua thì các phần tử từ start Index sẽ bị xóa đến cuối mảng.
let a = [0,1,2,3,4]
a.splice(2,2) // returns the removed elements [2,3]
// ...and `a` is now [0,1,4]
Ngoài ra còn có một tên tương tự, nhưng khác nhau, chức năng trên Array.prototype
: Array#slice
.
Mảng # lát ([bắt đầu [, kết thúc]])
Array#slice
không phá hủy và trả về một mảng mới chứa các chỉ mục được chỉ định từ start
đến end
. Nếu end
không được chỉ định, nó mặc định đến cuối mảng. Nếu end
là dương, nó chỉ định chỉ số không bao gồm dựa trên số 0 dừng lại ở. Nếu end
âm, nó chỉ định chỉ mục dừng lại bằng cách đếm ngược từ cuối mảng (ví dụ: -1 sẽ bỏ qua chỉ mục cuối cùng). Nếu end <= start
, kết quả là một mảng trống.
let a = [0,1,2,3,4]
let slices = [
a.slice(0,2),
a.slice(2,2),
a.slice(2,3),
a.slice(2,5) ]
// a [0,1,2,3,4]
// slices[0] [0 1]- - -
// slices[1] - - - - -
// slices[2] - -[3]- -
// slices[3] - -[2 4 5]
Mảng # pop
Array#pop
xóa phần tử cuối cùng khỏi một mảng và trả về phần tử đó. Thao tác này thay đổi độ dài của mảng.