比较for、for...in、for...of、forEach

1. for

优点:

  • 程序简洁,结构清晰,循环初始化,循环变量化,循环体和循环条件位置突出
  • 可以使用continue 跳出本次循环,进行下次循环
  • 可以使用break 中止for循环

缺点:

  • 它和forEach,for of一样不可以遍历对象(解决办法:就是把对象先转化为数组类型)
//有一个对象:
     let obj={a:1,b:2,c:3}
//用Object.keys属性转化
  let obj2=Object.keys(obj)
//最后就可以用来遍历了
   for (let i=0;i<obj2.length;i++){
     console.log(obj2[i])
   }
//输出结果就能出来了,forEach,for of同理

2. for…in

for in 的循环性能循环很差。性能差的原因是因为: for in 会迭代对象原型链上一切 可以枚举的属性。

定义:用于循环遍历数组或对象属性,fot in循环里面的index是string类型的,

  • 代码每执行一次,就会对数组的元素或者对象的属性进行一次操作

优点:可以遍历数组的键名,遍历对象简洁方便

缺点:

  • for in 会将公有(prototype) 中可枚举的属性也遍历了。可以使用 hasOwnProperty来阻止遍历公有属性。
  • for in 循环主要遍历数字优先,由小到大遍历
  • for in 无法遍历 Symbol属性(不可枚举)。

2.1 遍历对象是获取key值

//首先遍历对象
   let person={name:"老王",age:23,city:"大唐"}
   let text=""
   for (let i in person){
      text+=person[i]
   }
   输出结果为:老王23大唐

2.2 遍历数组是index值

//其次在尝试一些数组
   let arry=[1,2,3,4,5]
   for (let i in arry){
        console.log(arry[i])
    }
//能输出出来,证明也是可以的

3. for…of

一个数据结构只要部署了 Symbol.iterator 属性,就被视为具有 iterator 接口,就可以用 for...of 循环遍历它的成员。也就是说,for...of 循环内部调用的是数据结构的 Symbol.iterator 方法。

for...of 循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如 arguments 对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。

优点:避免了for in的所有缺点,可以使用break,continue和return.

缺点:不适用于处理原有的原生对象(原生对象是一个子集,包含一些在运动过程中动态创建的对象)

//遍历数组
   let arr=["nick","freddy","mike","james"];
    for (let item of arr){
        console.log(item)
    }
//暑促结果为nice freddy mike james


//遍历对象
   let person={name:"老王",age:23,city:"唐山"}
   for (let item of person){
        console.log(item)
    }
//我们发现它是不可以的

4. forEach

(三个参数,第一个是value,第二个是index,第三个是数组体)

缺点:不能同时遍历多个集合,在遍历的时候无法修改和删除集合数据,方法不能使用break,continue语句跳出循环,或者使用return从函数体返回,对于空数组不会执行回调函数

优点:便利的时候更加简洁,效率和for循环相同,不用关心集合下标的问题,减少了出错的效率

定义:用于调用数组的每个元素,并将元素传递给回调函数

//我们先用它来遍历数组
  let arry=[9,8,7,6,5,4]
  array.forEach(function(value,index,arr){
      console.log(value)
  })
//输出结果为9 8 7 6 5 4

//首先有人疑问它能不能用来遍历对象(一开始我也不知道)?
//我们用它来遍历对象试试可不可以
   let obj={a:1,b:2,c:3,d:4}
   obj.forEach(function(value,index,oObj){
       console.log(value)
   }
//输出结果会是obj.forEach is not a function,
//所以forEach不可以遍历对象,这也是它和for in的一个区别

for for…in, for of , forEach 图表对比

循环名称 参数 中断方式
for 1:continue;跳出当次循环,可继续进行下一个循环;
2:break;跳出当前循环,即不在进行此循环;如果是多个for循环嵌套,则不影响外层循环;
3:return;结束函数调用;
for…in 只有一个参数 item(对象的时候是key值, 数组的时候是index值) 同上
for…of 只有一个参数 item,它是含有iterator的数据的元素值 同上
forEach (三个参数,第一个是value,第二个是index,第三个是数组体) 实现continue的效果可以直接使用return
实现break的效果可以使用try、throw Error(),通过跳出错误的方式跳出循环。

for for…in, for of , forEach 效率比较

for > forEach > for of >for in

你可能感兴趣的:(前端,前端)