Array.prototype.splice的意外行为

时间:2015-06-28 04:09:04

标签: javascript arrays iteration

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

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实施的每次迭代期间未计算长度

1 个答案:

答案 0 :(得分:1)

好问题。 :)

在Javascript中,Arrays是Objects,这意味着Array索引是Object键。在Javascript中,Object键是字符串。

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

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

index === '2' 

或者,或者,您可以使用等式运算符来进行比较(虽然这可能会让您在某些时候遇到麻烦)...

index == 2 

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