删除数组索引的原型也会删除数组索引

时间:2018-01-21 01:19:31

标签: javascript arrays ecmascript-6 in-operator

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"]。为什么会这样?我知道如果你删除一个属性,它就不会存在,但在这种情况下,属性也是数组的索引。对这种奇怪的行为有什么好的解释吗?

4 个答案:

答案 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)

Deleting array elements

enter image description here

  

删除数组元素时,数组长度不受影响。即使您删除了数组的最后一个元素,这也成立。

     

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"]相同,这就是您获得该输出的原因。