本here的教程指出
"如果使用delete运算符删除属性,则使用in运算符 为该属性返回false。"
以下是他们为此所说的一个例子:
var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
delete trees[3];
3 in trees; // returns false
但是,我的问题是,在删除树[3]之前,Object.getOwnPropertyNames(trees)
会返回["0", "1", "2", "3", "4", "length"]
,但在删除之后会返回["0", "1", "2", "4", "length"]
。为什么会这样?我知道如果你删除一个属性,它就不会存在,但在这种情况下,属性也是数组的索引。对这种奇怪的行为有什么好的解释吗?
答案 0 :(得分:1)
您没有删除原型。您正在删除对象实例上的属性。
由于JS中的数组只是对象,因此这是一个相同的过程:
const array = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
}
delete array[2]
console.log(Object.getOwnPropertyNames(array))
不同的是,删除数组元素时,数组长度不受影响。
答案 1 :(得分:1)
现在你已经得到了答案。你的困惑是,如果你删除一个项目,它就不应该占用空间了。长度应该相应调整,对吗?
您应该使用Array.prototype.splice()安全地从数组中删除元素。它会为您正确调整长度和索引
var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
trees.splice(3,1)
console.log(trees.length) // 4
答案 2 :(得分:0)
删除数组元素时,数组长度不受影响。即使您删除了数组的最后一个元素,这也成立。
当
delete
运算符删除数组元素时,该元素不再在数组中。
因此,在您的情况下,您将删除元素而不是属性。
答案 3 :(得分:0)
Array
只是object
的一种特殊类型。它包含键/值,就像任何其他object
一样。考虑一下:
let arr = [1,2,3];
console.log(arr[3] === arr["3"])
因此,3
的索引和键值"3"
是相同的。当您delete trees[3]
时,您要删除名为"3"
的媒体资源。 delete trees[3]
与delete trees["3"]
相同,这就是您获得该输出的原因。