在为我正在处理的项目实施内部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
实施的每次迭代期间未计算长度
答案 0 :(得分:1)
好问题。 :)
在Javascript中,Arrays是Objects,这意味着Array索引是Object键。在Javascript中,Object键是字符串。
所以你的条件index === 2
总是假的,因为数字2与字符串'2'不同。
一种解决方案是继续使用身份运算符(大多数人推荐)并将index
与字符串值'2'进行比较
index === '2'
或者,或者,您可以使用等式运算符来进行比较(虽然这可能会让您在某些时候遇到麻烦)...
index == 2
但在你的情况下效果很好。