for ... in循环,字符串数组输出索引

时间:2011-09-20 04:05:03

标签: javascript

当我写一些像这样的javascript:

var words = ['word1', 'word2', 'word3']

for (word in words) {
    console.log(word)
}

结果输出是相应单词的数字索引。我在Google上进行了一些搜索,但我找不到这种行为的确切原因。我猜这是完全预期的行为,但我想知道原因。

谢谢!

4 个答案:

答案 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()有几个优势。首先,您可以使用breakcontinuereturn来控制.forEach()未提供给您的循环流,从而获得更多循环控制。此外,回调函数没有额外的开销,因此在某些环境中,它可以更快。

答案 1 :(得分:1)

  1. for..in用于迭代javascript对象的属性。
  2. 将数组视为具有索引作为属性的javascript对象。

答案 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)
}