javascript - 为什么带有数组的 'for(var item in list)' 在 JavaScript 中被认为是不好的做法?

标签 javascript arrays loops

给定一个简单的从零开始的数字索引数组:

var list = ['Foo', 'Bar', 'Baz'];

很多时候,我注意到当有人建议像这样循环遍历数组中的变量时:

for(var item in list) { ... }

...几乎可以肯定有人认为这是不好的做法,并提出了一种替代方法:

var count = list.length;

for(var i = 0; i < count; i++) {
    var item = list[i];
    ...
}

不使用上面更简单的版本而使用第二个示例的原因是什么?

最佳答案

首先,for...in 循环的循环顺序是未定义的,因此不能保证属性会按照您想要的顺序迭代。

其次,for...in 遍历对象的所有可枚举属性,包括从其原型(prototype)继承的属性。在数组的情况下,如果您的代码或页面中包含的任何库扩充了 Array 的原型(prototype),这可能会影响您,这可能是一件真正有用的事情:

Array.prototype.remove = function(val) {
    // Irrelevant implementation details
};

var a = ["a", "b", "c"];

for (var i in a) {
    console.log(i);
}

// Logs 0, 1, 2, "remove" (though not necessarily in that order)

关于javascript - 为什么带有数组的 'for(var item in list)' 在 JavaScript 中被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2265167/

相关文章:

javascript - 字符串中的函数

c++ - 使用按位运算符仅查找数组中存在一次的数字

javascript - 难以将 switch 语句与类和 for 循环一起使用

java - 如何迭代语句中的值?

javascript - 使用 JavaScript 将嵌套对象/关联数组转换为查询字符串

javascript - 为什么当我点击 li 时会触发 ul?

javascript - jQuery:向日期字符串添加前导零

c++ - 如何修复 : error: no match for 'operator=' (operand types are 'Estado' and 'Estado*' )

arrays - 具有可变内容类型和长度的元组数组?

python - 如何拆分 Python 列表的每个第 N 个元素