在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是:

简单for循环

for-in

forEach

在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循环,是:

for-of

下面我们就来看看这 4 种 for 循环。


简单 for 循环

下面先来看看大家最常见的一种写法:

const arr = [1, 2, 3];for(let i = 0; i < arr.length; i++) { console.log(arr[i]);}

当数组长度在循环过程中不会改变时,我们应将数组长度用变量存储起来,这样会获得更好的效率,下面是改进的写法:

const arr = [1, 2, 3];for(let i = 0, len = arr.length; i < len; i++) { console.log(arr[i]);}

for-in

通常情况下,我们可以用 for-in 来遍历一遍数组的内容,代码如下:

const arr = [1, 2, 3];let index;for(index in arr) { console.log("arr[" + index + "] = " + arr[index]);}

一般情况下,运行结果如下:

arr[0] = 1arr[1] = 2arr[2] = 3

但这么做往往会出现问题。


for-in 的真相

for-in 循环遍历的是对象的属性,而不是数组的索引。因此, for-in 遍历的对象便不局限于数组,还可以遍历对象。例子如下:

结果如下:

person[fname] = sanperson[lname] = zhangperson[age] = 99

需要注意的是, 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-in 来循环数组的例子,我们修改一下前面遍历数组的例子:

运行结果是:

arr[0] = 1arr[1] = 2arr[2] = 3arr[name] = Hello world

我们看到 for-in 循环访问了我们新增的 "name" 属性,因为 for-in 遍历了对象的所有属性,而不仅仅是“索引”。

同时需要注意的是,此处输出的索引值,即 "0"、 "1"、 "2"不是 Number 类型的,而是 String 类型的,因为其就是作为属性输出,而不是索引。

那是不是说不在我们的 Array 对象中添加新的属性,我们就可以只输出数组中的内容了呢?

答案是否定的。因为 for-in 不仅仅遍历 array 自身的属性,其还遍历 array 原型链上的所有可枚举的属性。下面我们看个例子:

运行结果是:

arr[0] = 1arr[1] = 2arr[2] = 3arr[name] = Hello worldarr[fatherName] = Father

写到这里,我们可以发现 for-in 并不适合用来遍历 Array 中的元素,其更适合遍历对象中的属性,这也是其被创造出来的初衷。却有一种情况例外,就是稀疏数组。考虑下面的例子:

for-in 只会遍历存在的实体,上面的例子中, for-in 遍历了3次(遍历属性分别为"0"、 "100"、 "10000"的元素,普通 for 循环则会遍历 10001 次)。所以,只要处理得当, for-in 在遍历 Array 中元素也能发挥巨大作用。

为了避免重复劳动,我们可以包装一下上面的代码:

使用示例如下:

for-in 性能

正如上面所说,每次迭代操作会同时搜索实例或者原型属性, for-in 循环的每次迭代都会产生更多开销,因此要比其他循环类型慢,一般速度为其他类型循环的 1/7。因此,除非明确需要迭代一个属性数量未知的对象,否则应避免使用 for-in 循环。如果需要遍历一个数量有限的已知属性列表,使用其他循环会更快,比如下面的例子:

上面代码中,将对象的属性都存入一个数组中,相对于 for-in 查找每一个属性,该代码只关注给定的属性,节省了循环的开销和时间。


forEach

在 ES5 中,引入了新的循环,即 forEach 循环。

const arr = [1, 2, 3];arr.forEach((data) => { console.log(data);});

运行结果:

123

forEach 方法为数组中含有有效值的每一项执行一次 callback 函数,那些已删除(使用 delete 方法等情况)或者从未赋值的项将被跳过(不包括那些值为 undefined 或 null 的项)。 callback 函数会被依次传入三个参数:

  • 数组当前项的值;
  • 数组当前项的索引;
  • 数组对象本身;

需要注意的是,forEach 遍历的范围在第一次调用 callback 前就会确定。调用forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。

运行结果:

a 0 ["a

django中的for循环_深入了解 JavaScript 中的 for 循环相关推荐

  1. java中的感叹号是_[Java教程]javascript中的2个感叹号的用法

    [Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...

  2. js中while死循环语句_如何检测JavaScript中的死循环?

    如果我们需要执行用户写的代码,如和避免死循环?我们最近遇到了这个问题,因为写错代码很常见,所以我们进行了一下尝试. 首先我们需要使用iframe 这主要是安全考虑,我们需要一个sandbox环境来执行 ...

  3. .Net 6.0中的新增特性_.Net 6.0中的新增功能

    .Net 6.0中的新增特性_.Net 6.0中的新增功能 一..Net 6 介绍 .NET 6 作为 LTS 长期支持版本,.NET 6 将会获得 3 年的技术支持. .NET 6 是首个原生支持 ...

  4. css如何保留空格,HTML/CSS中的空格处理_如何保留页面中的空格

    html中的空格的规则 在html中内容中的多个空格一般会被视为一个,连续的多个空格符被自动合并了.同时内容前后的空格也会被清除, 如下: fly63 com 显示效果为: fly63 com 备注: ...

  5. amp jsp空格 nps_HTML/CSS中的空格处理\_如何保留页面中的空格【转】

    HTML/CSS中的空格处理\_如何保留页面中的空格[转] HTML中的空格的规则 在html中内容中的多个空格一般会被视为一个,连续的多个空格符被自动合并了.同时内容前后的空格也会被清除, 如下: ...

  6. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别

    [Java教程]JavaScript中值类型和引用类型的区别 0 2017-02-24 00:00:35 JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和 ...

  7. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  8. shell脚本for循环_了解Shell脚本中的for循环

    shell脚本for循环 Continuing on from our previous tutorials, let's understand the for loop in shell scrip ...

  9. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

最新文章

  1. 如何导入pytorch包_PyTorch 目前的运行途径
  2. mysql 查询字段语句_mysql查询语句常用字段操作函数
  3. 详解nohup和 区别
  4. 懒惰是人类进步的动力,勤奋是实现偷懒的途径
  5. 装饰者模式(C#)实现
  6. 每天进步一点点——mysql——Percona XtraBackup(innobackupex)
  7. 波束形成MATLAB代码
  8. cadvisor 离线安装
  9. 京东的焦虑:强制996,高管离职,奶茶风波...
  10. 流程图制作软件绘图技巧:快速学会怎么画流程图
  11. 全国计算机教学图片,全国“xx杯”计算机类说课大赛课件一等奖作品:图层蒙版教学课件.pptx...
  12. 为什么老外不看好Filecoin?
  13. 如何使用ABP开发一
  14. mac os 触摸屏_为什么没有出现触摸屏Mac
  15. 【设计模式】工厂模式的作用?工厂模式有什么优点?
  16. 北斗三号精密单点定位(PPP-B2b)
  17. Minecraft 1.18.1、1.18.2模组开发 10.生物生成
  18. 【Python教程】Python快速教程
  19. crontab可能存在的问题
  20. 北邮计算机2015学霸,我国邮电大学“四大金刚”1所211比985还难考剩下3所非学霸难考上...

热门文章

  1. 面试官:一个线程OOM,进程里其他线程还能运行么?
  2. 从 no-code 到 low-code 再到 pro-code
  3. 千里之行,始于OKR——轻雀协作团队管理分享
  4. 什么是SQL数据库?
  5. selenium+Edge浏览器实现web端自动化测试
  6. C++中的文件读写操作(1)
  7. ubuntu16.04 sudo apt-get update解决Hash sum错误
  8. 基于地面几何约束的单目视觉里程计精确鲁棒尺度恢复(ICRA 2021)
  9. [CVPR 2020] RandLA-Net:大场景三维点云语义分割新框架(已开源)
  10. 背光源:你究竟是怎样的波长?