for...of
遍歷一個可迭代對象的迭代器。在ES6規範中,通過Symbol.iterator
屬性在對象上標識爲對象生成迭代器的函數;即someObj[Symbol.iterator]
。
對於每個可迭代類型,迭代器返回Symbol.iterator
是不同的,但一般來說,它只會迭代對象所包含的值,這些值與該類型相關。例如:
添加屬性的對象的原型是不太可能影響到迭代器的行爲,所以在這方面不是必要的來測試該值是否來自自己的財產。
for..of
和for..in
是根本不同的。for..in
迭代對象的屬性,有時需要詢問有關這些屬性的問題,例如它們是否被繼承。 for..of
將值從一個迭代器中抽出,它私下決定按什麼順序返回哪些值。詢問一個for..of
迭代的結果是否來自繼承的屬性並不重要,因爲它可能根本不來自屬性。 (典型的例子,for..of
迭代未暴露性質的Map
返回值。)
我能想到的只有一個(極其奇怪的)情況,其中繼承屬性會影響一個Array
的行爲迭代器,如果滿足以下所有都是真的:
- 如果
Array.prototype
有一個整數名稱的屬性,並
- 是整數命名屬性是不設置爲流在實例正財產被迭代,和
- 實例的
length
比整數索引的名字
例如更大:
Array.prototype["7"] = "hello"; // why are you doing this?? :O
var a = [1,2,3]
a.length = 8; // why are you doing this?? D:
for(g of a) { console.log(g); } // great job, you got strange results
在這種極其詭異的案子,你會遍歷在繼承的7
屬性上。這實際上是我能想到的唯一案例;其他繼承的屬性將被忽略,因爲它們沒有整數名稱,或者因爲它們被具有相同整數名稱的實例屬性遮蔽,或者因爲它們大於或等於實例的length
。
爲什麼不直接看[文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of)? – hindmost
「for ... for循環與for ... in循環之間的區別。for ...在迭代屬性名稱時,用於...對屬性值進行迭代:」 – Ziki
我做過了,它不是'如果它對自己的屬性進行迭代,則從它們中清除。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of – pQuestions123