2015-12-21 40 views
6

我正在讀上使用地圖的for.. of循環this例子,我有點糊塗了這個語法:上ES6使用for..of環地圖

var myMap = new Map(); 
myMap.set(0, "zero"); 
myMap.set(1, "one"); 

for (var [key, value] of myMap) { 
    console.log(key + " = " + value); 
} 

具體來說,我不明白正在發生的數組解構。我知道你可以使用數組解構來做類似let [one, two] = [1, 2];的事情,但是這個例子中發生了什麼? myMap不是一個數組,那麼爲什麼這會得到正確的值?

另一個問題我已經是爲什麼在解構的順序key, value,但是當你做一個forEach()的順序是value, key,喜歡這裏:

myMap.forEach((value, key) => { 
    console.log(key + " = " + value); 
}); 

回答

10
for (var [key, value] of myMap) { 
    console.log(key + " = " + value); 
} 

就像

for (let pair of myMap) { 
    var [key, value] = pair; 
    console.log(key + " = " + value); 
} 

所以它不是myMap必須是一個解構的數組才能工作;相反,它的每個元素在迭代時都必須是一個數組,迭代映射確實會產生數組(鍵/值對)。

Map#forEach的參數順序可能是用於與Array#forEach,這就要求與參數(item, index)功能一致性;反過來,它可能會這樣做,因爲你並不總是需要索引。

+0

謝謝你的簡單明瞭的解釋! – saadq

+0

清晰簡單。 – void

2

myMap不是一個數組,所以爲什麼這會得到正確的值?

地圖的原型具有[Symbol.iterator]屬性,這意味着Map的實例實現了iterator contract

for of循環利用迭代器來遍歷對象。

換句話說,對於循環不需要數組,它們需要迭代表。數組只是一種可迭代的,地圖是另一種。

在映射的情況下,迭代器會爲每次迭代生成一個由鍵和值組成的2元素數組。它還具有其他方法,允許您僅遍歷鍵或值。