对forEach、for-in还有es6的for-of的一些整理

总结:

  1. forEach 遍历数组的话,不能用break跳出循环,也不能用return返回外层,可以通过抛异常的形式提前终止遍历。
  2. for-in 循环用来遍历对象属性不建议用for-in循环遍历数组【支持break,continue,return(注意,return在这里会终止后面整个程序的执行))】。
  3. for-of 循环用来遍历数据--如数组中的值。它和forEach不同,它可以break、continue、return。同时又避开了for-in 的缺点,可以遍历数组,大多数类数组对象(dom的NodeList),字符串,map和set。break会终止本次for循环,return怎会终止整个方法继续运行下去。

一、forEach

如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止。

function foreach(a,f,t){
    try { a.forEach(f,t); }
    catch(e){
        if(e === foreach.break)return;
        else throw e;
    }
}
foreach.break = new Error("StopIteration");

二、for...in

for...in 循环只遍历可枚举属性。像 Array 和 Object , Number等 js中基本包装类型的原型属性是不可枚举的 , 它们是使用内置构造函数所创建的对象都会继承自 Object.prototype 和 String.prototype 的不可枚举属性,例如  String  的  indexOf()  方法或者  Object 的  toString 方法。 循环将迭代对象的所有可枚举属性和从它的构造函数的 prototype 继承而来的(包括被覆盖的内建属性)。
可以注意到for-in循环 能够枚举继承的属性名,所以在 数组上不建议使用for-in循环
可以使用 hasOwnProperty方法来过滤。所有继承了  Object 的对象都会继承到  hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和  in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
for(var i in a){
     if(!a.hasOwnProperty(i)) continue;//跳过继承的属性
     //循环体
}
不建议用for-in循环遍历数组还有以下几点原因:
  • 代码中的index不是数字,是字符串“0”、“1”、“2”,可能无意间进行字符串的计算“2”+1=“21”等。
  • 代码可能按照随机顺序遍历数组元素。
for-in是为了对象设计的,可以遍历字符串型的键。
ps:属性的枚举性还会影响以下两个函数的结果:  Object.keys() ;  JSON.stringify();  它们只能返回对象本身具有的可枚举属性。

三、for-of循环

for(var value of myArray){
     console.log(value);
}
它和forEach不同,它可以break、continue、return。同时又避开了for-in 的缺点。
for-of可以遍历:
  • 数组
  • 大多数类数组对象:如DOM的NodeList对象
  • 字符串
  • 也支持map和set对象的遍历
例如
//遍历Set
//基于单词数组创建一个set对象
var uniqueWords= new Set(words);
 
for(var word of uniqueWords){
     console.log(word);
}
 
//遍历Map
//map是键值对组成的,所以需要解构来将键值对拆解为两个独立变量:
for(var[key,value] of phoneBookMap){
     console.log(key+"'s phone number is:" + value);
}
 
for-of不支持普通对象,如果你想迭代一个对象属性,可以用for-in循环或内建Object.keys()方法:
 
for(var key of object.keys(someObject)){
     console.log(key+":"+someObject[key]);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaiking_g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值