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 与 C 和 C++ 中的关键字的功能不同:它不直接释放内存。相反,它的唯一目的是从对象中删除属性。
对于数组,删除与索引对应的属性会创建一个稀疏数组(即,其中有一个“洞”的数组)。大多数浏览器将这些缺失的数组索引表示为“空”。
var array = [0, 1, 2, 3]
delete array[2] // [0, 1, empty, 3]
请注意,delete 不会将 array[3] 重新定位到 array[2]。
JavaScript 中不同的内置函数以不同的方式处理稀疏数组。
for...in 将完全跳过空索引。
传统的for 循环将针对索引处的值返回undefined。
任何使用Symbol.iterator 的方法都将返回undefined 作为索引处的值。
forEach、map 和 reduce 将直接跳过缺失的索引。
因此,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 从数组中删除最后一个元素,并返回该元素。这个操作改变了数组的长度。