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

for each in/for in/for of

for each...in

Syntax

for each (variable in object) {
  statement
}
variable
用來遍歷屬性值的變數,前面的var關鍵字是可選的.該變數是函式的區域性變數而不是語句塊的區域性變數.
object
該物件的屬性值會被遍歷.
statement
遍歷屬性值時執行的語句. 如果想要執行多條語句, 請用({ ... }) 將多條語句括住.

 

一些物件的內建屬性是無法被遍歷到的,包括所有的內建方法,例如String物件的indexOf

方法.不過,大部分的使用者自定義屬性都是可遍歷的.

for...in 

以任意順序遍歷一個物件的可列舉屬性。對於每個不同的屬性,語句都會被執行。

Syntax:

for (variable in object) { ...
}

引數:

variable
在每次迭代時,將不同的屬性名分配給 變數
object
被迭代其列舉屬性的物件。

 

for..in 不應該被用來迭代一個下標順序很重要的 Array .

陣列索引僅是可列舉的整數名,其他方面和別的普通物件屬性沒有什麼區別。for...in 並不能夠保證返回的是按一定順序的索引,但是它會返回所有可列舉屬性,包括非整數名稱的和繼承的。

因為迭代的順序是依賴於執行環境的,所以陣列遍歷不一定按次序訪問元素。 因此當迭代那些訪問次序重要的 arrays 時用整數索引去進行 for 迴圈 (或者使用 Array.prototype.forEach() 或 for...of 迴圈) 。

僅迭代自身的屬性

如果你只要考慮物件本身的屬性,而不是它的原型,那麼使用 getOwnPropertyNames() 或執行  hasOwnProperty() 來確定某屬性是否是物件本身的屬性 (也能使用

propertyIsEnumerable)。另外,如果你知道外部不存在任何的干擾程式碼,你可以擴充套件內建原型與檢查方法。

例子

複製程式碼
var obj = {a:1, b:2, c:3};
    
for (var prop in obj) {
  console.log("obj." + prop + " = " + obj[prop]);
}

// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
複製程式碼 複製程式碼
var triangle = {a:1, b:2, c:3};

function ColoredTriangle() {
  this.color = "red";
}

ColoredTriangle.prototype = triangle;

var obj = new ColoredTriangle();

for (var prop in obj) {
  if( obj.hasOwnProperty( prop ) ) {
    console.log("o." + prop + " = " + obj[prop]);
  } 
}

// Output:
// "o.color = red"
複製程式碼

for...of

Syntax

for (variable of iterable) {
  statement
}

variable
在每個迭代中的值被分配給不同的屬性可變
iterable
可迭代物件的屬性進行迭代。