该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]
细节
deleteJavaScript中的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从数组中删除最后一个元素,然后返回该元素。此操作将更改数组的长度。