当前位置: 首页 > 科技观察

Javascript中的四个For循环

时间:2023-03-12 06:14:11 科技观察

在ECMAScript5(简称ES5)中,一共有三个循环。在2015年6月发布的ECMAScript6(简称ES6)中,增加了一种新的循环类型。它们是:forforinforeachfor今天,我们就来看看这4个for循环。1.简单的for循环我们来看看最常见的写法:constarr=[1,2,3];for(leti=0;i{console.log(data);});运行结果:123forEach方法对数组中每一项包含有效值执行回调函数value,已经删除(使用delete方法等)或从未赋值的Item将被跳过(不包括那些未定义或为null的)。回调函数会依次传入三个参数:数组中当前项的值;数组中当前项的索引;数组对象本身;需要注意的是,forEach遍历的范围会在第一次调用回调之前确定。调用forEach后添加到数组的项目将不会被回调访问。如果现有值发生变化,则传递给回调的值是forEach遍历它们时的值。不遍历删除的项目。constarr=[];arr[0]=“a”;arr[3]=“b”;arr[10]=“c”;arr.name=“Helloworld”;arr.forEach((数据,索引,数组)=>{console.log(data,index,array);});运行结果:a0["a",3:"b",10:"c",name:"Helloworld"]b3["a",3:"b",10:"c",name:"Helloworld"]c10["a",3:"b",10:"c",name:"Helloworld"]这里的index是Number类型,不会像for-in那样遍历原型链上的属性。因此,在使用forEach的时候,我们不需要特别声明索引和要遍历的元素,因为这些都是回调函数的参数。另外,forEach会遍历数组中的所有元素,但是ES5定义了一些其他有用的方法,下面是其中的一部分:every:循环第一次返回false之后返回some:循环第一次返回之后返回true元素满足回调函数的新数组map:在返回前处理原数组中的元素reduce:依次处理数组中的元素,将上一次处理的结果作为下一次处理的输入,最终得到最后结果。ForEach性能你可以看看jsPerf。在不同浏览器中测试的结果是forEach没有for快。如果将测试代码放在控制台中,您可能会得到不同的结果。主要原因是控制台的执行环境和真正的代码执行环境不一样。4、for-of先来看一个例子:constarr=['a','b','c'];for(letdataofarr){console.log(data);}运行结果为:abc为什么要引入for-of?要回答这个问题,我们先来看看ES6之前的三个for循环的缺陷:forEach不能被中断返回;for-in的缺点更加明显。它不仅遍历数组中的元素,还遍历自定义属性,甚至访问原型链上的属性。此外,遍历数组元素的顺序可以随机化。因此,针对以上不足,我们需要对原有的for循环进行改进。但是ES6不会破坏您已经编写的JS代码。目前有数以千计的网站依赖for-in循环,其中一些甚至将其用于数组遍历。通过修复for-in循环来添加数组遍历支持会使这一切变得更加混乱,因此标准委员会在ES6中添加了一个新的循环语法来修复当前的for-of问题。那么for-of能做什么呢?与forEach相比,可以正确响应break、continue、return。for-of循??环不仅支持数组,还支持大多数类数组对象,例如DOMnodelist对象。for-of循??环还支持字符串遍历,它将字符串遍历为Unicode字符序列。for-of还支持Map和Set(都是ES6中新增的)对象遍历。总而言之,for-of循??环具有以下特性:它是迭代数组元素的最简洁直接的语法。这种方法避免了for-in循环的所有缺陷。与forEach不同,它可以正确响应break、continue和return语句。它不仅可以迭代数组,还可以迭代类数组对象和其他可迭代对象。然而,应该注意的是,for-of循??环不支持普通对象,但是如果你想遍历对象的属性,你可以使用for-in循环(它就是这样做的)。最后但同样重要的是,ES6引入了另一种迭代数组值的方法,那就是Iterator。最后一个例子:constarr=['a','b','c'];constiter=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还有很多话要说。