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
但在你的情况下效果很好。
在为我正在处理的项目实现内部 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
但在你的情况下效果很好。