搞懂map()、forEach()、for...in、for...of的区别

186 阅读2分钟

话不多说,直接学

第一组:map()、forEach()

共同点:

  1. 都只能循环数组
  2. 接受三个参数:currentItem循环的当前项, index当前项索引(可选), arr原数组(可选)
  3. return,break 无法中止或跳出循环
  4. 内部匿名函数的this指向window

image.png

image.png

区别:

map()

  • map()有返回值,返回一个新数组,不改变原数组。
  • 用于——需要返回一个新数组时 forEach()
  • forEach()无返回值,改变原数组。
  • 用于——不改变每一项数据,只是用数据处理一些事项

案例:

map(): 格式化数组中的对象

var arr = [{key: 1, value: 10},
           {key: 2, value: 20},
           {key: 3, value: 30}];
           
返回一个新数组
var newArr = arr.map(itemObj => {
   var newObj = {};
   newObj[itemObj.key] = obj.value;
   return newObj;
});

// newArr 新数组为: [{1: 10}, {2: 20}, {3: 30}],

// arr 原数组未被修改:
// [{key: 1, value: 10},
//  {key: 2, value: 20},
//  {key: 3, value: 30}]

forEach()

    let list = [1, 2, 3, 4, 5];
    list.forEach((value, index) => {
        if(value > 3){
            console.log(value)  // 4 5
            return false;//没有返回值,ruturn false 仍向下执行(使用return不退出执行,使用break报错)
        } else {
            console.log(value)  // 1 2 3
            return true;
        }
    });

第二组:for...in、for...of

for...in

  • 通常用于遍历对象
  • for...in遍历总是取得对象的键“key”,数组/字符串的下标。 即都为【字符串类型】
  • 遍历的顺序不一定是按照下标,而是随机遍历
  • 会遍历数组所有的可枚举属性,包括原型里的属性,方法

for...of

  • 通常用于遍历数组/字符串/map/set等有迭代器对象的集合。不能遍历对象
  • for...of遍历总是取得对象的键“value”,数组/字符串的【值】
  • 不会遍历数组所有的可枚举属性,包括原型里的属性,方法
  • 与forEach区别,可响应break,return,continue语句

总之:咱要遍历对象——for...in。 遍历数组——for...of

补充:可迭代对象

哪些是可迭代对象

  • Set,Map,String,Array,Arguments,Nodelist 如何判断是否为可迭代对象
  • Array.prototype.hasOwnProperty(Symbol.iterator)