js遍历之for forEach in of

即使是最简朴的轮回,个中也深藏学问

ECMAScript5(es5)有三种for轮回

  • 简朴for
  • for in
  • forEach

ECMAScript6(es6)新增

  • for of

简朴for

for是轮回的基本语法,也是最经常运用的轮回构造。没有兼容性问题,效力上:for > forEach > map >for in

forEach

forEach由es5提出,属于数组的迭代要领

概述: 要领让数组的每一项都实行一次给定的函数。

语法: array.forEach(callback[currentValue,index,array,thisArg]);

参数:

  • currentValue:当前遍历项。
  • index:当前项目标下标
  • array:当前数组自身
  • thisArg:修正内部值的指向。

特性:

forEach 要领为数组中含有有效值的每一项实行一次 callback 函数,那些已删除(运用 delete 要领等状况)或许从未赋值的项将被跳过(不包括那些值为 undefined 或 null 的项)。
forEach 遍历的范围在第一次挪用 callback 前就会肯定。挪用forEach 后添加到数组中的项不会被 callback 访问到。假如已存在的值被转变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。

长处:

foreach会跳过数组中的空位
相对简朴for来讲更语义化

瑕玷:

不能中缀轮回,也不支撑 continue 和 break,只能经由过程 return 来掌握轮回,然则不能退出轮回自身。

兼容性: 只支撑IE9及以上
机能: forEach 的速率不如 for

for in

此轮回有一个特别的用处:能够罗列任何对象的定名属性。实际上它是为轮回”enumerable“对象而设想的。

须要注重的是,for-in 轮回遍历的是对象的属性,而不是数组的索引。由于对象的属性没有递次,for in轮回输出的输出的属性名也是不可展望的

机能:

由于每次迭代操纵要搜刮实例或原型属性, for-in 轮回的每次迭代都邑发生更多开支,因而实行速率比其他轮回范例慢。在一样的轮回迭代操纵中,别的范例轮回速率要比它快7倍之多。除非对数量不详的对象属性举行操纵,不然我们不引荐运用for in 轮回。

Array 的原形

Array 在 Javascript 中是一个对象, Array 的索引是属性名。事实上, Javascript 中的 “array” 有些误导性, Javascript 中的 Array 并不像大部分其他言语的数组。起首, Javascript 中的 Array 在内存上并不一连,其次, Array 的索引并非指偏移量。实际上, Array 的索引也不是 Number 范例,而是 String 范例的。我们能够准确运用如 arr[0] 的写法的原因是言语能够自动将 Number 范例的 0 转换成 String 范例的 "0" 。所以,在 Javascript 中从来就没有 Array 的索引,而只需相似 "0" 、 "1" 等等的属性。风趣的是,每一个 Array 对象都有一个 length 的属性,致使其表现地更像其他言语的数组。但为何在遍历 Array 对象的时刻没有输出 length 这一条属性呢?那是由于 for-in 只能遍历“可罗列的属性”, length 属于不可罗列属性,实际上, Array 对象另有很多其他不可罗列的属性。

es6的for of

for of是由es6提出的,目标是作为遍历一切数据构造的一致要领。

我们先来回忆一下此前js的遍历要领:

  • foreach是为方便数组而设想的,不能准确相应break、continue和return语句
  • for in被设想用来罗列对象的属性的,遍历对象的属性
  • for in用在数组上,除了遍历数组元素之外,还会遍历自定义属性,以至原型链上的属性,别的,遍历递次是随机的

那末for of 有什么不一样呢?

特性:

  • 语法同for in一样简约,但避开了for in的缺点
  • 能准确相应break、continue和return语句
  • 跟for in不一样,数组的遍历器接口只返回具有数字索引的属性
  • for in读取的是对象的键名,for of读取的是键值
  • 供应遍历一切数据构造的一致要领。for of不仅能够遍历数组,还能够遍历Set、Map构造,某些相似数组的对象(如:argument对象、DOM NodeList对象),Generator对象,以及字符串。
如:
let arr = ['a' ,'b', 'c', 'd'];
let itr = arr[Symbol.iterator];

arr.forEach(function(val, index, arr){
    console.log(val); // a b c d
    console.log(index); // 0 1 2 3
});

for(let i of itr){
    console.log(i);  // a b c d
}

for(let i of arr){
    console.log(i);  // a b c d
}

for(let i in arr){
    console.log(i);  // 0 1 2 3
}

只需具有Iterator接口的数据构造,都能够运用for of轮回遍历它的成员。关于Iterator,假如还不清晰的能够先去相识一下,这里就不赘述了。这里须要注重一下,由于for of读取的是键值,假如想经由过程for of猎取键名,能够借助数组实例的entries和keys要领。

    原文作者:lynneshow
    原文地址: https://segmentfault.com/a/1190000009985137
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞