在JavaScript中使用循环有两个关键点需要理解:可枚举属性和可迭代对象。可枚举属性可枚举对象的定义特征是,当通过赋值运算符将属性分配给对象时,我们将内部可枚举标志设置为true,这是默认值。当然,我们可以通过将其设置为false来更改此行为。要点:可以用for...in遍历可枚举属性。举个例子://会出现在for...in循环中constgbols={};gbols.platform="LogRocket";Object.getOwnPropertyDescriptor(gbols,"platform");//{value:"LogRocket",writable:true,enumerable:true,configurable:true}for(constitemingbols){console.log(item)}//platform//不会出现在for...in循环中//设置enumerable为falseObject.defineProperty(gbols,'role',{value:'Admin',writable:true,enumerable:false})for(constitemingbols){console.log(item)}//平台可迭代对象如果一个对象定义了它的迭代行为,那么它就是可迭代的。在这种情况下,将在for...of构造中循环的值将定义其迭代行为。可迭代的内置类型包括数组、字符串、集合和映射。对象不可迭代,因为它没有指定@iterator方法。在Javascript中,所有可迭代对象都是可枚举对象,但并非所有可枚举对象都是可迭代对象。for...in查找数据中的对象,而for..of查找重复序列。我们来看一个例子:constauthors=['小智','小王','小明','小红'];//用fro(constauthorinauthors){console.log(author)}//用forin循环打印:0,1,2,3for(constauthorofauthors){console.log(author)}//打印:小智小王小明小红在使用这个结构的时候需要注意如果调用typeof得到的类型是object,你可以使用for...in循环。我们看一下authors变量的操作:typeofauthors//打印出“object”,所以我们可以使用`for..in`乍一看好像有点奇怪,但是必须注意,数组是一个特殊的对象,它使用索引作为键。当for...in循环找到对象时,它会遍历每个键。for...in遍历authors数组的方式可以通过以下显式方式理解:constauthors={0:'Jade',1:'Dafe',2:'Gbols',3:'Daniel'}重要说明:if可以追溯到对象(或从对象原型链继承它),因为for...in将以无特定顺序迭代键。同时,如果您实现一个用for..of构造的迭代器,它将在每次迭代时循环遍历该值。ForEach和map方法虽然forEach和map方法可用于实现相同的目标,但它们的行为和性能存在差异。在基本层面上,当函数被调用时,它们都接收一个回调函数作为参数。考虑以下代码片段:constscoresEach=[2,4,8,16,32];constscoresMap=[2,4,8,16,32];constsquare=(num)=>num*num;我们一一列举它们在操作上的一些差异。forEach返回undefined,map返回一个新数组:letnewScores=[]constresultWithEach=scoresEach.forEach((score)=>{constnewScore=square(score);newScores.push(newScore);});constresultWithMap=scoresMap.map(正方形);console.log(resultWithEach)//undefinedconsole.log(resultWithMap)//[4,16,64,256,1024]map是一个纯函数,而forEach进行了一些改动:console.log(newScores)//[4,16,64,256,1024]在我看来,map倾向于函数式编程范式。与我们并不总是需要执行更改以获得所需结果的forEach不同,在forEach中,我们需要对newscore变量进行更改。在每次运行时,map函数在给定相同输入时将产生相同的结果。同时,forEach对应方将从最后更改的先前值中获取数据。链式映射可以使用链式操作,因为映射返回的结果是一个数组。因此,可以根据结果立即调用任何其他数组方法。换句话说,我们可以调用filter、reduce、some等。ForEach这是不可能的,因为返回值是未定义的。性能map方法的性能往往优于forEach方法。检查使用map和forEach实现的等效代码块的性能。平均而言,map函数的执行速度至少提高了50%。注意:此基准取决于您使用的计算机和浏览器的实现。总结在上面讨论的所有循环结构中,给我们最多控制权的是for..of循环。我们可以将它与关键字return、continue和break一起使用。这意味着我们可以指定我们希望数组中的每个元素发生什么,以及我们是想提前离开还是跳过。本文转载自微信公众号“伟大的走向世界”,您可以通过以下二维码关注。转载本文请联系大千世界公众号。
