即便是最简单的循环,其中也深藏学问es6
ECMAScript5(es5)有三种for循环数组
ECMAScript6(es6)新增数据结构
for是循环的基础语法,也是最经常使用的循环结构。没有兼容性问题,效率上:for > forEach > map >for in函数
forEach由es5提出,属于数组的迭代方法性能
概述: 方法让数组的每一项都执行一次给定的函数。this
语法: array.forEach(callback[currentValue,index,array,thisArg]);
es5
参数:设计
特色:code
forEach 方法为数组中含有有效值的每一项执行一次 callback 函数,那些已删除(使用 delete 方法等状况)或者从未赋值的项将被跳过(不包括那些值为 undefined 或 null 的项)。 forEach 遍历的范围在第一次调用 callback 前就会肯定。调用forEach 后添加到数组中的项不会被 callback 访问到。若是已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。
优势:对象
foreach会跳过数组中的空位 相对简单for来讲更语义化
缺点:
不能中断循环,也不支持 continue 和 break,只能经过 return 来控制循环,可是不能退出循环自己。
兼容性: 只支持IE9及以上
性能: forEach 的速度不如 for
此循环有一个特殊的用途:能够枚举任何对象的命名属性。实际上它是为循环”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 对象还有许多其余不可枚举的属性。
for of是由es6提出的,目的是做为遍历全部数据结构的统一方法。
咱们先来回顾一下此前js的遍历方法:
那么for of 有什么不同呢?
特色:
如: 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方法。