当我写一些像这样的javascript:
var words = ['word1', 'word2', 'word3']
for (word in words) {
console.log(word)
}
结果输出是相应单词的数字索引。我在Google上进行了一些搜索,但我找不到这种行为的确切原因。我猜这是完全预期的行为,但我想知道原因。
谢谢!
答案 0 :(得分:24)
为什么没有人提供正确答案?你永远不会用for/in
循环迭代数组 - 这只是为了迭代普通对象及其键,而不是迭代数组中的项。
你为这样的for循环迭代数组:
var words = ['word1', 'word2', 'word3'];
for (var i = 0, len = words.length; i < len; i++) {
// here words[i] is the array element
}
或者,在现代浏览器中,您可以使用数组的.forEach()
方法:
var words = ['word1', 'word2', 'word3'];
words.forEach(function(value, index, array) {
// here value is the array element being iterated
});
有关.forEach()
的详细信息,请参阅here at MDN。
ndp对this post的引用显示了使用for/in
数组可能出错的一些很好的例子。你有时可以使它工作,但它不是编写Javascript数组迭代的聪明方法。
或者,在更现代的时候,您可以使用ES6 for/of
构造,该构造专门用于迭代迭代(数组是可迭代的):
var words = ['word1', 'word2', 'word3'];
for (const w of words) {
console.log(w);
}
或者,如果你想要值和索引,你可以这样做:
var words = ['word1', 'word2', 'word3'];
for (const [index, w] of words.entries()) {
console.log(index, ": ", w);
}
for/of
优于.forEach()
有几个优势。首先,您可以使用break
,continue
,return
来控制.forEach()
未提供给您的循环流,从而获得更多循环控制。此外,回调函数没有额外的开销,因此在某些环境中,它可以更快。
答案 1 :(得分:1)
答案 2 :(得分:1)
For ... in
适用于objects - 请参阅this question。显然它可以(并且)用于数组,但这有一些你可能不想要的风险。
答案 3 :(得分:1)
正如其他答案正确指出的那样,for...in
不适用于迭代数组。现在可以在较新的JavaScript引擎和转换器中使用更好的选项,例如TypeScript with for...of
:
var words = ['word1', 'word2', 'word3']
for (word of words) {
console.log(word)
}