【问题标题】:deleting prototype for array indices deletes the array indices as well删除数组索引的原型也会删除数组索引
【发布时间】:2026-02-20 23:45:01
【问题描述】:

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

【问题讨论】:

    标签: javascript arrays ecmascript-6 in-operator


    【解决方案1】:

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

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

    const array = {
      '0': 'a',
      '1': 'b',
      '2': 'c',
      length: 3
    }
    
    delete array[2]
    console.log(Object.getOwnPropertyNames(array))

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

    【讨论】:

    • 哦,我真的很抱歉,我的意思只是财产。很抱歉迷路了。
    • 哦,是的。刚刚注意到长度保持不变,并且该位置的元素显示为空。 ["redwood", "bay", "cedar", empty, "maple"]
    【解决方案2】:

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

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

    var trees = new Array('redwood', 'bay', 'cedar', 'oak', 'maple');
    
    trees.splice(3,1)
    
    console.log(trees.length) // 4
    

    【讨论】:

      【解决方案3】:

      Deleting array elements

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

      delete 运算符删除一个数组元素时,该元素不再在数组中。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】: