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

deleting prototype for array indices deletes the array indices as well

关于 here 的教程指出

"If you delete a property with the delete operator, the in operator returns false for that property."

下面是他们为此声明的示例之一:

var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
delete trees[3];
3 in trees; // returns false

但是,我的问题是,在删除树[3]之前,Object.getOwnPropertyNames(trees) returns ["0", "1", "2", "3", "4", "length"],但在删除之后 returns ["0", "1", "2", "4", "length"]。为什么会这样?我知道如果你删除一个 属性 ,那么它就不会存在,但在这种情况下 属性 也是数组的索引。对这种奇怪的行为有什么好的解释吗?

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

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

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

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

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

Deleting array elements

When you delete an array element, the array length is not affected. This holds even if you delete the last element of the array.

When the delete operator removes an array element, that element is no longer in the array.

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

Array只是object的一种特殊类型。它由 keys/values 组成,就像任何其他 object 一样。考虑一下:

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

所以3的索引和键值"3"是一回事。当您 delete trees[3] 时,您将删除名称为 "3" 的 属性。 delete trees[3]delete trees["3"] 相同,这就是您获得该输出的原因。

到现在你已经明白了answer.Your的困惑是如果你删除了一个项目它不应该占用space anymore.And长度应该相应地调整,对吧?

您应该使用 Array.prototype.splice() 从 array.It 中安全地删除元素 将为您适当地调整长度和索引

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

trees.splice(3,1)

console.log(trees.length) // 4