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]);
}
相关文章
相关标签/搜索