Array.prototype.splice 的意外行为

Unexpected behavior of Array.prototype.splice

在为我正在处理的项目实现内部 EventEmitter 时,在 for... in 循环中使用 Array.prototype.splice 时遇到了一个奇怪的怪癖。该函数没有成功地从循环中的数组中删除索引:

var array = [1, 2, 3, 4, 5], index;

for (index in array) {
    if (index === 2) {
        array.splice(index, 1);
    }

    console.log(array[index]);
}

console.log(array);

运行 在 Google Chrome 版本 43 上,输出

1
2
3
4
5
[1, 2, 3, 4, 5]

当我期待

1
2
4
5
undefined†
[1, 2, 4, 5]

这是设计使然还是错误?我找不到任何关于此行为的文档参考。

可能,如果在 for... in 实现的每次迭代期间不计算长度

好问题。 :)

在Javascript中,Arrays are Objects,也就是说Array indices是Object keys。在 Javascript 中,对象键是字符串。

所以你的条件 index === 2 总是假的,因为数字 2 与字符串 '2' 不同。

一种解决方案是继续使用身份运算符(大多数人推荐)并将 index 与字符串值 '2'

进行比较
index === '2' 

或者,您也可以使用相等运算符来对比较进行类型转换(尽管这可能会在某些时候给您带来麻烦)...

index == 2 

但在你的情况下效果很好。