簡體   English   中英

for ... in循環,字符串數組輸出索引

[英]for … in loop with string array outputs indices

當我寫一些像這樣的javascript:

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

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

結果輸出是相應單詞的數字索引。 我在Google上進行了一些搜索,但我找不到這種行為的確切原因。 我猜這是完全預期的行為,但我想知道原因。

謝謝!

為什么沒有人提供正確的答案? 你永遠不會用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()更多信息,請參見MDN

ndp對這篇文章的引用顯示了使用for/in with arrays可能出錯的一些很好的例子。 你有時可以使它工作,但它不是編寫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()沒有給你的循環流。 此外,回調函數沒有額外的開銷,因此在某些環境中,它可以更快。

正如其他答案正確指出的那樣, for...in不是為了迭代數組。 現在可以在較新的JavaScript引擎和轉換器中使用更好的選項,例如TypeScript with for...of

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

for (word of words) {
    console.log(word)
}
  1. for..in用於迭代javascript對象的屬性。
  2. 將數組視為具有索引作為屬性的javascript對象。

For ... in用於對象 - 請參閱此問題 顯然它可以(並且)用於數組,但這有一些你可能不想要的風險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM