【JavaScript-基础】map、forEach、for、for in、for of等的区别

本文介绍了 JavaScript 中几种循环方式,包括 forEach、Map、for…of 和 for…in。forEach 和 Map 会遍历全部数据,不能通过 return 结束,前者用于不转换数据的遍历,后者常用于转换数据结构;for…of 可遍历具有 iterator 接口的对象,能中断循环;for…in 可遍历数组和对象,大多用于遍历对象,也能中断循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tips:循环虽好,大家都得按自己所需场景进行使用。个人建议,不喜勿喷

forEach

forEach: forEach(item,index,array), item:当前处理的数据,index:下标,
array:整个数组
遍历全部数据,不能通过return结束循环,消耗性能
用于不转换数据的全部遍历。
tips: 除了抛出异常以外,没有办法中止或跳出 forEach() 循环。如果你需要中止或跳出循环,forEach() 方法不是应当使用的工具。

 // forEach 跳出循环
      const inventory = [
        { name: "apples", quantity: 2 },
        { name: "bananas", quantity: 0 },
        { name: "cherries", quantity: 5 },
      ];

      function  fn(arr){
        console.log('回调函数',arr)
      }
      function getItem(arr,name,fn){
        let item = null
        try {
            arr.forEach((element,i,arr) => {
                console.log(element,i,arr)
                if(element.name === name){
                    item = element;
                    fn(arr)
                    throw Error();
                }
            });
        } catch (error) {}
        return item;
      }

// forEach 和 map 的原生实现,都可挂载Array的原型上去实现你想要的方法
Array.prototype.myForEach = function (fn) {
    for(let i = 0; i < this.length; i++){
    	fn(this[i], i, this);
    }
};
arr.myForEach(function (currentValue, currentIndex, currentArray) {
   console.log(currentValue, currentIndex, currentArray);
});
// map 和这个类似

Map

map(item,index,array), item:当前处理的数据,index:下标,
array:整个数组
一定遍历全部数据,不能通过return结束,消耗性能,不要常用。
常用于转换数据结构,比forEach快。和forEach都不影响原有的数组结构。

 const inventory = [
        { name: "apples", quantity: 2 },
        { name: "bananas", quantity: 0 },
        { name: "cherries", quantity: 5 },
      ];
 const newarr = inventory.map(({ name, quantity }) => ({
        [name]: quantity,
 }));

for…of

一般的对象是不能使用for…of 进行遍历。具有 iterator 接口就可以用for…of循环遍历它的成员(属性值value)for…of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象、Generator 对象,以及字符串。for…of循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的属性。对于普通的对象,for…of结构不能直接使用,会报错,必须部署了 Iterator 接口后才能使用。可以中断循环。

一个对象如果要具备可被 for…of 循环调用的 Iterator 接口,就必须在其 Symbol.iterator 的属性上部署遍历器生成方法(或者原型链上的对象具有该方法)

tips: 遍历器对象根本特征就是具有next方法。每次调用next方法,都会返回一个代表当前成员的信息对象,具有value和done两个属性。

实例代码如下:
普通对象是不具备遍历器接口,例如:

 let obj = {
   name:'jack',
   age:20,
   job:'web engineer'
}

for(const item of obj){
	console.log(item) //Uncaught TypeError: obj is not iterable
}

给普通对象增加Iterator 才能进行遍历:
想了解为啥要这么使用点击该链接

let obj = {
        name:'jack',
        age:20,
        job:'web engineer',
        [Symbol.iterator](){
            const self = this;
            const keys = Object.keys(self);
            let index = 0;
            return{
                next(){
                    if(index < keys.length){
                        return {
                            value:self[keys[index++]],
                            done:false
                        }
                    }else{
                        return {
                            value:undefined,
                            done:true
                        }
                    }
                }
            }
        }
    }
     for(const item of obj){
        console.log(item) 
		//name:'jack',
        //age:20,
        //job:'web engineer'
    }

注意:
原生具备 Iterator 接口的数据结构有:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象
  • ES6 的数组、Set、Map 都部署了以下三个方法: entries() / keys() / values(),调用后都返回遍历器对象。

for…in

不但可以遍历数组,还可以遍历对象,数组遍历下标,对象遍历属性。
大多场景用来遍历对象。遍历对象自身的和继承的可枚举的属性,也就是说会包括那些原型链上的属性。如果想要仅迭代自身的属性,那么在使用 for…in 的同时还需要配合 getOwnPropertyNames() 或 hasOwnProperty()。可以中断循环。

let obj = {
    name:'jack',
    age:20,
    job:'web engineer',
}
for(const key in obj){
	console.log(key); // name,age,job
	 console.log(obj[key]) // jack,20,web engineer
}

let arr1 = ['name','age','job']
for(const key in arr1){
   console.log(key); // 1,2,3
   console.log(arr1[key]) // name,age,job
}

xdm,再不睡觉头发丝又得掉几根…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值