delete 运算符用于从对象中删除属性。
const obj = { foo: "bar" };
delete obj.foo;
obj.hasOwnProperty("foo"); // false
请注意,对于数组,这与删除元素不同。要从数组中删除元素,请使用 Array#splice 或 Array#pop。例如:
arr; // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr; // [0, 1, 2, 4]
详情
严格来说,在 JavaScript 中不可能真正删除任何内容。 delete 运算符既不删除对象也不释放内存。相反,它将其操作数设置为 undefined 并操作父对象,以便成员消失。
let parent = {
member: { str: "Hello" }
};
let secondref = parent.member;
delete parent.member;
parent.member; // undefined
secondref; // { str: "Hello" }
对象没有被删除。只有参考是。只释放内存
当对对象的所有引用都被删除时,由垃圾收集器处理。
另一个重要的警告是delete 运算符不会为您重新组织结构,其结果可能看起来违反直觉。例如,删除数组索引会在其中留下一个“洞”。
let array = [0, 1, 2, 3]; // [0, 1, 2, 3]
delete array[2]; // [0, 1, empty, 3]
这是因为数组是对象。所以索引和键是一样的。
let fauxarray = {0: 1, 1: 2, length: 2};
fauxarray.__proto__ = [].__proto__;
fauxarray.push(3);
fauxarray; // [1, 2, 3]
Array.isArray(fauxarray); // false
Array.isArray([1, 2, 3]); // true
JavaScript 中不同的内置函数以不同的方式处理带有孔的数组。
-
for..in 语句将完全跳过空索引。
-
一个幼稚的for 循环将为索引处的值生成undefined。
-
任何使用Symbol.iterator 的方法都会为索引处的值返回undefined。
-
forEach、map 和 reduce 只会跳过丢失的索引,但不会删除它
例子:
let array = [1, 2, 3]; // [1,2,3]
delete array[1]; // [1, empty, 3]
array.map(x => 0); // [0, empty, 0]
因此,delete 运算符不应用于从数组中删除元素的常见用例。数组有专门的移除元素和重新分配内存的方法:Array#splice() 和 Array#pop。
Array#splice(start[, deleteCount[, item1[, item2[, ...]]]])
Array#splice 改变数组,并返回所有删除的索引。 deleteCount 元素从索引start 中删除,item1, item2... itemN 从索引start 插入到数组中。如果 deleteCount 被省略,则 startIndex 中的元素将被删除到数组的末尾。
let a = [0,1,2,3,4]
a.splice(2,2) // returns the removed elements [2,3]
// ...and `a` is now [0,1,4]
Array.prototype 上还有一个名称相似但不同的函数:Array#slice。
数组#slice([begin[, end]])
Array#slice 是非破坏性的,它返回一个新数组,其中包含从start 到end 的指示索引。如果未指定 end,则默认为数组的末尾。如果end 是正数,它指定要停止的从零开始的非包含 索引。如果end 是负数,它通过从数组末尾倒数指定要停止的索引(例如,-1 将省略最终索引)。如果end <= start,则结果为空数组。
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]
数组#pop
Array#pop 从数组中删除最后一个元素,并返回该元素。此操作更改数组的长度。相反的操作是push
数组#shift
Array#shift 类似于pop,除了它删除了第一个元素。相反的操作是unshift。