4个Javascript中的for循环
在 ECMAScript5(简称 ES5)中,有三个循环。在 2015 年 6 月发布的 ECMAScript6(简称 ES6)中,新增了一种循环类型。他们是: for for in for each for of
今天,就让我们一起来看看这4个 for 循环。 1、简单的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 { console.log(data); });
操作结果: 1 2 3
forEach 方法对数组中包含有效值的每一项执行一次回调函数,那些已经被删除(使用delete 方法等)或从未赋值的项将被跳过(不包括那些未定义的项) 或空值)。回调函数会依次传入三个参数: 数组中当前项的值; 当前项在数组中的索引; 数组对象本身;
需要注意的是,forEach 遍历的范围会在第一次调用回调之前确定。调用 forEach 后添加到数组的项目不会被回调访问。
如果现有值发生变化,则传递给callback的值就是forEach遍历它们时的值。不会遍历已删除的项目。 const arr = []; arr[0] = "a"; arr[3] = "b"; arr[10] = "c"; arr.name = "Hello world"; arr.forEach((data, index, array) => { console.log(data, index, array); });
操作结果: a 0 ["a", 3: "b", 10: "c", name: "Hello world"] b 3 ["a", 3: "b", 10: "c", name: "Hello world"] c 10 ["a", 3: "b", 10: "c", name: "Hello world"]
这里的索引是Number类型的,不会像for-in那样遍历原型链上的属性。
因此,在使用forEach时,我们不需要特别声明索引和要遍历的元素,因为这些都是作为回调函数的参数。
另外,forEach 会遍历数组中的所有元素,但是 ES5 定义了一些其他有用的方法,下面是一部分: every:循环在第一次返回false后返回 some:循环在第一次返回 true 后返回 filter:返回一个元素满足回调函数的新数组 map:在返回之前处理原始数组中的元素 reduce:依次处理数组中的元素,将上一次处理的结果作为下一次处理的输入,最终得到最终结果。
forEach 性能
您可以看看jsPerf。在不同浏览器下测试的结果是forEach没有for快。如果将测试代码放在控制台中,可能会得到不同的结果。主要原因是控制台的执行环境与真实的代码执行环境不同。 4、for-of
我们先来看一个例子: const arr = [‘a’, ‘b’, ‘c’]; for(let data of arr) { console.log(data); }
运行的结果是: a b c
为什么要引入for-of?
要回答这个问题,我们先来看看 ES6 之前的 3 种 for 循环的缺陷:
forEach 不能中断和返回;
for-in 的劣势更加明显。它不仅遍历数组中的元素,还遍历自定义属性,甚至访问原型链上的属性。此外,遍历数组元素的顺序可以是随机的。
所以,针对以上缺点,我们需要对原来的for循环进行改进。但是 ES6 不会破坏您已经编写的 JS 代码。
目前,数以千计的网站依赖于 for-in 循环,其中一些甚至将其用于数组遍历。通过修复 for-in 循环来添加数组遍历支持会使这一切变得更加混乱,因此标准委员会在 ES6 中添加了一个新的循环语法来解决当前的问题 for-of 。
那么 for-of 能做什么呢?
与forEach相比,它可以正确响应break、continue、return。
for-of 循环不仅支持数组,还支持大多数类似数组的对象,例如 DOM 节点列表对象。
for-of 循环还支持字符串遍历,它将字符串作为 Unicode 字符序列进行迭代。
for-of 还支持 Map 和 Set(都是 ES6 中的新功能)对象遍历。
总结一下,for-of 循环具有以下特点:
这是迭代数组元素的最简洁直接的语法。
这种方法避免了 for-in 循环的所有陷阱。
与 forEach 不同,它正确响应 break、continue 和 return 语句。
它不仅可以遍历数组,还可以遍历类数组对象和其他可迭代对象。
然而,应该注意的是,for-of 循环不支持普通对象,但是如果您想遍历一个对象的属性,您可以使用 for-in 循环(它就是这样做的)。
最后,但并非最不重要的是,ES6 引入了另一种方法来迭代数组的值,那就是 Iterator。最后一个例子: const arr = [‘a’, ‘b’, ‘c’]; const iter = arr[Symbol.iterator](); iter.next() // { value: ‘a’, done: false } iter.next() // { value: ‘b’, done: false } iter.next() // { value: ‘c’, done: false } iter.next() // { value: undefined, done: true }
不过,这个内容超出了本文的范围,Iterator 有很多要讲的。
- End -
李瑞峰为魏建军打造新人设编辑导语随着魏牌摩卡DHTPHEV的发布,李瑞峰带领魏牌走上了高端新能源的新赛道。同时为补充营销短板,李瑞峰亲自下场直面用户,再开辟营销道路。怒怼造车新势力新势力和传统车企最主要差
新车文懂车帝原创陈旭明长安C385官图发布懂车帝原创产品近日,长安汽车正式发布全新纯电动轿车代号C385官方图片,其车身长度达到4820毫米,轴距为2900毫米,拥有中型轿车的尺寸。另
风洞实验,是通过放烟和布条来研究空气流动的?流言我们经常在汽车广告或纪录片里看到风洞的影像,都会拉烟或放布条,研究者通过观察它们来测定空气动力参数。真相这些只是为了便于观察,真正的玄机在风洞实验室的底板上。因为运动是相对的,
人民时评充分激发数字医疗的优势人民时评充分激发数字医疗的优势财联社3月29日电,人民时评文章指出,目前,全国已有2200多家三级医院初步实现院内信息互通共享,7700多家公立医院提供互联网医疗服务,在线医疗用户
Linux下CC手写一个线程池前言在我们日常生活中会遇到许许多多的问题,如果一个服务端要接受很多客户端的数据,该怎么办?多线程并发内存不够怎么办?所以我们需要了解线程池的相关知识。一线程池是什么?1。线程池的简
闲鱼常见骗局大揭秘,1999的国行iphone12pro?面交就安全了?315全民行动本内容为作者原创,观点仅代表作者本人作者落尽红樱君不见本人七年玩机经验,在闲鱼摸爬滚打那么多年,几乎没翻过车,甚至还凭经验捡过几次小漏洞!!下面我将向大家讲解我的经验
最大续航402公里,提供四驱版,一汽丰田纯电动bZ4X实车正式亮相近日,一汽丰田纯电动SUVbZ4X实车正式亮相,实际上该车已在去年广州车展首秀。新车在造型设计上更为激进。据悉,丰田bZ4X将分别由一汽丰田和广汽丰田国产,售价预计30万元左右,将
为什么选择无耗材空气净化器?空气净化节能减排低碳生活现在的空气净化器市场技术层出不穷鱼龙混杂,从耗材的使用角度来说主要分两种,一种是有耗材(需要定期更换过滤单元),另一种是无耗材(过滤单元经过清洗后可反复使用
比亚迪要对特斯拉下手了!纯电海豹或20万,搭载四驱续航700Km导读比亚迪要对特斯拉下手了!全新纯电海豹亮相,搭载四驱续航700Km比亚迪作为家喻户晓的国产品牌,旗下有着很多优秀的车型,而且早在十几年前就被众多消费者所接受,而且经典车型比亚迪F
新能源车换电单打独斗困局亟待破解精品能源内容,点击右上角加关注比快充强多了。日前,在位于上海张江AI未来街区的蔚来第二代换电站,蔚来车主廖雨霏的整个换电流程耗时仅6分钟。近日发布的十四五现代能源体系规划提出,推进
为什么美国不发展电商巨头?随着中国电商帝国的崛起,多少亿计的国民傻傻地引以为傲,好比一句小品说的话耗子给猫当三陪啊,被吃被玩还迷失其中而不自知,那么美国德国甚至科技大佬以色列为什么不会产生电商帝国哪?是网络