为什么删除运算符不会改变数组的长度?

3
作为一个例子,当在数组的索引上使用delete操作符时,该索引将被删除,就像任何对象的属性一样。
这可以通过以下方式证明:
var arr = ['one', 'two', 'three'];

delete arr[1];

if(1 in arr)
    alert("It didn't work!");

如果您运行此代码块,您会发现用户永远不会看到文本“它没有起作用!”。这是因为数组上属于索引1的属性已被删除。
现在,事情变得有些奇怪...
尽管从数组中删除了一个索引,但数组长度仍将保持不变:
var arr = ['one', 'two', 'three'];

alert(arr.length); //will alert '3'

delete arr[2];

alert(arr.length); //will still alert '3'

在调试器中查看数组arr时(至少在Chrome中),您会发现索引2甚至不存在,那么为什么长度仍然报告为3?

这里有一个JSFiddle可以玩耍。


我之前没有看到这些帖子,因为它们在我的搜索中没有出现。我同意我的问题可能是重复的。对此我深表歉意。 - WebWanderer
1个回答

3

当您调用其键之一进行删除操作时,数组实际上会失去该键,因此,如果您执行以下操作:

Object.keys(arr)

如果你看到的是key is missing并被undefined替换,那么说明该键值已经丢失。

编辑: 其他帖子提到了更好的答案,但这是我的看法。 删除不会调整大小,当你们全部推送时,put使用它所知道的最后一个大小进行调用。一些浏览器只显示被删除的键值为undefined。


哇!这真的很酷!谢谢@Abraham Adam! - WebWanderer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接