2015-10-08 38 views
7

在MDN https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of的,的JavaScript ...循環

它說While for...in遍歷屬性名稱,for...of遍歷屬性值。

那麼,爲什麼第二個for...of不記錄「你好」?

let arr = [3, 5, 7]; 
arr.foo = "hello"; 

for (let i in arr) { 
    console.log(i); // logs "0", "1", "2", "foo" 
} 

for (let i of arr) { 
    console.log(i); // logs "3", "5", "7" 
} 
+4

數組上的迭代(使用forEach,'for..of')只覆蓋零和'length-1'之間的屬性(即使未定義)。 'for..in'是不同的,它遍歷任何可枚舉的屬性。 – Touffy

+0

非常感謝您的及時回覆。現在,我不知道如何接受你的答案:-) –

+0

對不起,寫一些更詳細的東西,給我幾分鐘:) – Touffy

回答

9

的了... in語句遍歷對象,以任意順序的枚舉的屬性。

更確切地說,它的原型鏈中也包含了枚舉屬性。

並且每個對象都被視爲相同。這很簡單,令人困惑,很多人在陣列上使用它時會討厭它。

for..of在內部使用符號。任何具有[Symbol.iterator]的對象都可以迭代for..of,但是迭代了什麼以及在符號中以什麼順序定義,而不是通過語句本身的語義(允許惰性迭代器最初不知道屬性) 。

對於數組,迭代器遍歷零和數組的length-1之間的每個屬性,即使屬性未定義,也不會被for..in拾取。但它完全忽略了其他屬性,就像數組 .toString()從開始時間開始一樣,也是數組 .forEach()及其來自ES5的朋友。這使得數組迭代一致。

+0

非常感謝你的回答,我希望其他人遇到同樣的問題可以從這個得益:-) –

+0

事實上,這是我今天寫的第二個「for..in array」相關答案。數組意味着編號的有序值。 – Touffy

+0

確實如此,arr.foo =「hello」應該用作對象中的鍵值對 –