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方法。

js遍历for,forEach, for in,for of的更多相关文章

  1. js遍历

    最近看了一些不错的文章关于js遍历+js数组去重+文件上传的,今天也自己动手试了试.有好多之前不是细节不是很了解.正好学习了. map函数也是 类似这样的对象还有函数的属性arguments对象,当然 ...

  2. JS 遍历JSON中每个key值

    JS 遍历JSON中的每个key值,可以按键值对进行存储: var myVar = { typeA: { option1: "one", option2: "two&qu ...

  3. JS中的forEach、$.each、map方法推荐

    下面小编就为大家带来一篇JS中的forEach.$.each.map方法推荐.小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 orEach是ECMA5中Array新方法中最 ...

  4. Js遍历数组总结

    Js遍历数组总结 遍历数组的主要方法为for.forEach.map.for in.for of for var arr = [1,2,3,4,5]; var n = arr.length; // 直 ...

  5. js 遍历集合删除元素

    js 遍历集合删除元素 /** * 有效的方式 - 改变下标,控制遍历 */ for (var i = 0; i < arr.length; i++) { if (...) { arr.spli ...

  6. js遍历json对象

    原生js遍历json对象 遍历json对象: 无规律: <script> var json = [ {dd:'SB',AA:'东东',re1:123}, {cccc:'dd',lk:'1q ...

  7. js遍历添加栏目类添加css 再点击其它删除css

    //js遍历添加栏目类添加css 再点击其它删除css $(".radio-group .ckselect").each(function(index) { $(this).cli ...

  8. 用JS遍历循环时覆盖了之前的值

    使用js遍历Echarts时,三个数据项,七个分类,遍历如下, 其他都没有问题,就是series.data里的数据只加载了一组,控制台显示数组的长度是7,可是下面的数据只有一个 发现把给数据项赋值的语 ...

  9. Freemarker的页面和JS遍历后台传入的Map

    后端传到前端的Map Freemarker页面遍历Map: JS遍历Map:

随机推荐

  1. sql 2008数据事务日志已满处理方法

    突然发现sql 2008出现错误:数据库 'mybase_db' 的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc ...

  2. ssm框架与shiro的整合小demo,用idea开发+maven管理

    shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...

  3. height()、innerHeight()、outerHeight()函数的区别详解

    具体参考博客:http://www.365mini.com/page/jquery-height-vs-innerheight-vs-outerheight.htm

  4. Python程序打包成exe的一些坑

    今天写了一个项目,Python项目,需要在win7上跑起来,我想,这不是简单的不行么,直接上Pyinstaller不就完了? 但是后来,我发觉我真是too young too simple. 为什么这 ...

  5. es5严格模式简谈

    一.用法: 在全局或局部开头加上“use strict”即可 就是一行字符串,不会对不兼容严格模式的浏览器产生影响.二.不再兼容es3的一些不规则语法.使用全新的es5规范.三.两种用法: 全局严格模 ...

  6. WCF REST开启Cors 解决 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 405.

    现象: 编写了REST接口: [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(UriTemp ...

  7. linux shell编程(二) 条件测试

    bash中常用的条件测试有三种 条件测试的表达式:[ expression ]  [[ expression]] 第一种:整数测试: -eq 测试两个整数是否相等,比如[ $A -eq $B ] -n ...

  8. 用python实现的抓取腾讯视频所有电影的爬虫

    1. [代码]用python实现的抓取腾讯视频所有电影的爬虫    # -*- coding: utf-8 -*-# by awakenjoys. my site: www.dianying.atim ...

  9. javascript作用域与闭包

    Javasript作用域概要 在javascript中,作用域是执行代码的上下文,作用域有三种类型: 1)  全局作用域 2)  局部作用域(函数作用域) 3)  eval作用域 var foo = ...

  10. 分享知识-快乐自己:Struts2 (常用的 constant 总结)

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-/ ...