1

本教程在这里指出

“如果您使用 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

4 回答 4

1

您不是在删除原型。您正在删除对象实例上的属性。

由于 JS 中的数组只是对象,因此这是相同的过程:

const array = {
  '0': 'a',
  '1': 'b',
  '2': 'c',
  length: 3
}

delete array[2]
console.log(Object.getOwnPropertyNames(array))

不同的是,当您删除数组元素时,数组长度不受影响。

于 2018-01-21T01:26:14.797 回答
1

现在你已经得到了答案。你的困惑是,如果你删除一个项目,它不应该再占用空间了。长度应该相应地调整,对吧?

您应该使用Array.prototype.splice()安全地从数组中删除元素。它将为您正确调整长度和索引

var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');

trees.splice(3,1)

console.log(trees.length) // 4
于 2018-01-21T01:48:33.760 回答
0

删除数组元素

在此处输入图像描述

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

delete操作员删除一个数组元素时,该元素不再在数组中。

因此,在您的情况下,您删除的是元素而不是属性。

于 2018-01-21T01:27:01.330 回答
0

Array只是一种特殊的object. 它由键/值组成,就像任何其他object. 考虑一下:

let arr = [1,2,3];
console.log(arr[3] === arr["3"])

所以索引3和键值"3"是一回事。当您删除时delete trees[3],您正在删除带有 name 的属性"3"delete trees[3]与 相同delete trees["3"],这就是您获得该输出的原因。

于 2018-01-21T01:27:14.310 回答