该delete
运算符用于从对象中删除属性。
const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false
请注意,对于数组,这与删除element不同。要从数组中删除元素,请使用Array#splice
或Array#pop
。例如:
arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]
细节
delete
JavaScript中的JavaScript与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
从index中删除元素start
,并item1, item2... itemN
从index中将其插入数组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
。
Array#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]
Array#pop
Array#pop
从数组中删除最后一个元素,然后返回该元素。此操作将更改数组的长度。