for...in VS. for...of

先看下面這兩種寫法:
1.數組

tabList.forEach((tab, i) => {
    if (tab.is_main) {
        this.tabStores.push();
    }else{
        this.tabStores.push();
    }
});

2.函數

tabList.map((tab, i) => {
    let ViewComponent = null;
    if (tab.is_main) {
         ViewComponent = ( ); 
    }else {
         ViewComponent = ( );
    }
    return (  {ViewComponent} );
})

剛學習的時候一直以爲map和forEach是一樣的東西,上面的兩種寫法能夠隨便互換,後來有機會仔細查了一下,發現並非這樣。
在ES5種 forEach 和 map 同樣都具備遍歷數組的功能,可是他們的返回結果並不相同,使用 forEach 遍歷數組時,沒法使用break中斷循環,也沒法使用 return false 中斷,固然使用 return 也不能返回到外層函數。例如:學習

var arr = [1, 2, 3];
arr.forEach(function (value) {
  console.log(value);
  if (value == 2) {
    return false;
  }
});
// 結果是:1, 2, 3

for in VS. for ofthis

for...in循環出的是key,for...of循環出的是value
遍歷數組:code

var arr = [2, 5, 7];
for (let temp in arr){//枚舉數組
    console.log(temp);
}
//0 1 2
for (let temp of arr){//迭代數組
    console.log(temp);
}
//2 5 7

使用for...in的時候若是想要獲取數組內的value,能夠採用索引的方式,例如arr[temp];可是這個作法並很差,由於:1.temp並非一個數字,而是一個string,會無心間增長字符串計算;2.for in 不只能夠枚舉數組自身。數組的原型對象、數組對象自己的屬性也均可以枚舉出來 (可用hasOwnProperty()方法過濾非自有屬性);3.這段代碼可能按照隨機順序遍歷數組; 4.for... in不適用於數組的遍歷,更加適用於對象。對象

枚舉對象:索引

var obj = {
    a: 1,
    b: [],
    c: fn,
};
for ( let temp in obj){
    console.log(temp);
}
// a b c
for (let temp of obj){
    console.log(temp);
}
// Uncaught TypeError: obj is not iterable

for...of循環不支持普通對象,若是想迭代一個對象的屬性,可使用內建的Object.keys()方法;字符串

for(let key of Object.keys(obj)){
    //使用Object.keys()方法獲取對象key的數組
    console.log(key + ':' + obj[key]);
}
相關文章
相關標籤/搜索