前端各种循环的区别for of 等等

看了很多例子没有自己满意的总结一个

先上总结:

方法适用范围描述
for… inArray和Object获取可枚举的实例和原型属性名
Object.keys()Array和Object返回可枚举的实例属性名组成的数组
Object.getPropertyNames()Array和Object返回除原型属性以外的所有属性(包括不可枚举的属性)名组成的数组
for..of可迭代对象(Array, Map, Set, arguments等)返回属性值
foreach可迭代对象(Array, Map, Set, arguments等)返回属性值

for in

for (var i in colors) {
  typeof i; // string
}
  • for in是ES5标准
  • for..in主要获取对象的属性名。
  • 返回的是所有能够通过对象访问的、可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例
  • 返回的属性因各个浏览器厂商遵循的标准不一致导致对象属性遍历的顺序有可能不是当初构建时的顺序
  • 主要用于遍历对象的属性,但同样也可以用来遍历数组元素。
  • 上面的代码可以知道i是String类型,普通的循环中的是number
  • 为啥是字符串?我们从对象的视角来看待数组的话,实际上它是一个key为下标,value为数组元素值的对象
  • 对于不存在的项是不会被枚举出来的,不存在的元素没有在调试工具中显示出来,但是它在内存中是存在的,我们仍然可以删除这些元素。
  • 使用in操作符来判断某个key值(数组中的索引)是否存在对应的元素。
  • 主要目的就是遍历对象的属性,如果只需要获取对象的实例属性,可以使用hasOwnProperty()进行过滤。

for of

var colors = ['red', 'green', 'blue'];
colors.length = 5;
colors.push('yellow');

for (var i in colors) {
  console.log(colors[i]); // red green blue yellow
}

for (var j of colors) {
  console.log(j); // red green blue undefined undefined yellow
}
  • for of是ES6标准
  • 主要来遍历可迭代的对象(包括Array, Map, Set, arguments等),它主要用来获取对象的属性值
  • 可以避免所有 for-in 循环的陷阱
  • .不同于 forEach(),可以使用 break, continue 和 return
  • for-of 循环不仅仅支持数组的遍历。同样适用于很多类似数组的对象
  • 它也支持字符串的遍历
  • for-of 并不适用于处理原有的原生对象
  • for…of循环可以自动遍历 Generator 函数时生成的Iterator对象,且此时不再需要调用next方法。

for each

  • foreach 方法没办法使用 break 语句跳出循环,或者使用return从函数体内返回
  • forEach()无法在所有元素都传递给调用的函数之前终止遍历。也就是说,没有像for循环中使用的相应的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常。如果forEach()调用的函数抛出foreach.break异常,循环会提前终止:
function foreacha,f,t){

    try { a.forEach(f,t); }

    catch(e){

        if(e === foreach.breakreturn;

        else throw e;

    }

}



foreach.break = new Error("StopIteration");

Object.keys

  • 为ES5上的方法
  • 对于ES5以下的环境需要进行polyfill
  • 用于获取对象自身所有的可枚举的属性值,但不包括原型中的属性,然后返回一个由属性名组成的数组。注意它同for..in一样不能保证属性按对象原来的顺序输出。
  • 注意在 ES5 环境,如果传入的参数不是一个对象,而是一个字符串,那么它会报 TypeError。在 ES6 环境,如果传入的是一个非对象参数,内部会对参数作一次强制对象转换,如果转换不成功会抛出 TypeError。

Object.getOwnPropertyNames

  • 返回对象的所有自身属性的属性名(包括不可枚举的属性)组成的数组,但不会获取原型链上的属性。
  • -

查看一个属性 的特性:propertyIsEnumberable():Object.getOwnPropertyDescriptor()
定义一个属性:Object.defineProperty()

// 安全使用hasOwnProperty方法
var hasOwn = Object.prototype.hasOwnProperty;
for (var i in colors) {
  if (hasOwn.call(colors, i)) {
    console.log(i); // 输出:0 1 2
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值