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

哪个是JavaScript中最快的循环?

时间:2023-03-13 23:25:10 科技观察

哪个循环更快?答案其实是:for(reversedorder)最让我吃惊的是,我在本地电脑上测试后,不得不承认for(reversedorder)都是for循环事实是下面我最快的'将给出一个对包含超过一百万个项目的数组执行循环的示例。免责声明:console.time()结果的准确性在很大程度上取决于我们运行测试的系统配置。您可以在此处阅读有关准确性的更多信息。constmillion=1000000;constarr=Array(million);console.time('?');for(leti=arr.length;i>0;i--){}//for(reverse):-1.5msfor(leti=0;iv)//foreach:-2.1msfor(constvofarr){}//for...of:-11.7msconsole.timeEnd('?');造成这个结果的原因很简单。代码中,正向和反向for循环耗时几乎相同,仅相差0.1毫秒。原因是for(逆序)只需要计算一次初始变量leti=arr.length,而在正序的for循环中,每次变量增加后都会检查条件i,forEach是一个方法数组原型。forEach和for...of比普通的for循环需要更多的时间来遍历数组。(译者注:但值得注意的是,for...of和forEach都是从对象中获取数据,而原型没有,所以不做比较。)(正反)我想,大家应该对这个基本循环非常熟悉了吧。我们可以在需要将一段代码运行批准次数的任何地方使用for循环。最基本的for循环跑得最快,所以我们应该每次都用它吧?不,性能不仅仅是唯一的衡量标准,代码可读性往往更重要,让我们选择适合我们应用程序的变体吧。2、forEach方法需要接受一个回调函数作为入参,遍历数组的每一个元素,执行我们的回调函数(给回调函数元素本身及其索引(可选参数)作为参数)。forEach还允许在回调函数中使用可选参数this。constthings=['have','fun','coding'];constcallbackFun=(item,idex)=>{console.log(`${item}-${index}`);}things.foreach(callbackFun);/*输出have-0fun-1coding-2*/3。for...offor...of在ES6(ECMAScript6)中被标准化。它会为一个可迭代对象(如array、map、set、string等)创建一个循环,并且有一个突出的优点,就是优秀的可读性。constarr=[3,5,7];conststr='hello';for(letiofarr){console.log(i);//输出3,5,7}for(letiofstr){console.log(i);//output'h','e','l','l','o'}需要注意的是,生成器中请不要使用for...of,即使for...of循环终止早期的。退出循环后,生成器关闭并尝试再次迭代而不产生任何进一步的结果。4.forinfor…in在对象的所有可枚举属性上迭代指定变量。对于每个不同的属性,除了数字索引之外,for...in语句还返回用户定义属性的名称。因此,在遍历数组时最好使用带有数字索引的传统for循环。因为for...in语句还会遍历除数组元素之外的用户自定义属性,即使我们修改了数组对象(例如添加自定义属性或方法)。constdetails={firstName:'jo??hn',lastName:'Doe'};letfullName='';for(letiindetails){fullName+=details[i]+'';//fullName:johndoe}for…ofandfor…infor…of和for...in之间的主要区别在于它们迭代的内容。for...in遍历对象的属性,而for...of遍历可迭代对象的值。letarr=[4,5,6];for(letiinarr){console.log(i);//'0','1','2'}for(letiofarr){console.log(i);//'4','5','6'}结论是最快的,但是可读性比较差。foreach更快并且可以控制内容。for...of比较慢,但是香for...in比较慢,不太方便