1. 程式人生 > >for...each...in;for...in;for...of;

for...each...in;for...in;for...of;

for each...in

for each...in 陳述在物件屬性值的所有值上迭代指定的變數。對於每個不同的屬性,將執行指定的語句。
句法
for each (variable in object) {
  statement
}
variable
變數對屬性值進行迭代,可以使用var關鍵詞。此變數是函式的本地變數,而不是迴圈的本地變數。
object
物件,該物件的屬性是迭代的。
statement
為每個屬性執行的語句。若要在迴圈中執行多個語句,請使用塊宣告({ ... })將這些宣告分組。

描述
一些內建屬性不被迭代。這些包括所有內建的物件方法,例如。String氏indexOf方法。但是,所有使用者定義的屬性都會被迭代。


for...in

for...in陳述遍歷所有非-符號, 可列舉屬性一個物體的。
句法
for (variable in object) { ...
}
variable
一個不同的屬性名被分配給變數每次迭代。
object
物件,其非符號可列舉屬性被迭代。

描述
A for...in迴圈只對可列舉的非符號屬性進行迭代。從內建建構函式建立的物件,如Array和Object繼承不可列舉屬性。
Object.prototype和String.prototype,如String氏indexOf()方法或Object氏toString()方法。
迴圈將迭代物件本身的所有可列舉屬性以及物件從建構函式的原型繼承的屬性(Prototype鏈中更接近物件的屬性覆蓋原型的屬性)。

刪除、新增或修改屬性
A for...in迴圈以任意順序迭代物件的屬性(請參閱delete操作符,以瞭解為什麼不能依賴於似乎有序的迭代,至少在跨瀏覽器設定中是這樣的)。

如果一個屬性在一次迭代中被修改,然後在以後的某個時間被訪問,那麼它在迴圈中的值就是它在以後的時間的值。在訪問之前刪除的屬性將不會在以後訪問。新增到正在進行迭代的物件中的屬性可以被訪問,也可以從迭代中省略。

通常,在迭代期間最好不要從物件中新增、修改或刪除屬性,而不是當前正在訪問的屬性。不能保證是否會訪問新增的屬性,
修改後的屬性(當前的屬性除外)是否會在修改之前或之後訪問,或者刪除之前是否會訪問已刪除的屬性。

陣列迭代和.
注: for...in不應用於迭代Array索引順序很重要的地方。

陣列索引只是具有整數名的可列舉屬性,在其他方面與一般物件屬性相同。不能保證for...in將以任何特定順序返回索引。
for...in迴圈語句將返回所有可列舉屬性,包括具有非整數名的屬性和繼承的屬性。

因為迭代的順序依賴於實現,所以迭代陣列可能不會以一致的順序訪問元素。
因此,最好使用for使用數字索引(或Array.prototype.forEach()或者for...of迴圈)在訪問順序重要的陣列上迭代時。

只迭代自己的屬性
如果只想考慮附加到物件本身的屬性,而不是它的原型,請使用getOwnPropertyNames()或執行hasOwnProperty()
核對(propertyIsEnumerable也可以使用)。或者,如果您知道不會有任何外部程式碼干擾,您可以使用檢查方法擴充套件內建原型。

for...of

for...of陳述建立迴圈遍歷可迭代物件,包括:內建String, Array, Array-類似物體(例如,arguments或NodeList), TypedArray, Map, Set,
以及使用者定義的可迭代性。它呼叫自定義迭代鉤子,併為物件的每個不同屬性的值執行語句。

句法
for (variable of iterable) {
  statement
}
variable
在每次迭代中,都會將不同屬性值分配給變數.
iterable
物件,其可迭代屬性被迭代。

差異for...of和for...in

雙管齊下for...in和for...of語句迭代某物。它們之間的主要區別在於它們迭代的內容。

for...in語句遍歷可列舉屬性以任意順序排列的物體。
for...of語句對以下資料進行迭代:可迭代物件定義要被迭代。