文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript 中哪一种循环最快呢?

2024-12-03 07:27

关注

最让我感到惊讶的事情是,当我在本地计算机上进行测试之后,我不得不接受 for(倒序)是所有 for 循环中最快的这一事实。下面我会举个对一个包含超过一百万项元素的数组执行一次循环遍历的例子。

声明:console.time() 结果的准确度在很大程度上取决于我们运行测试的系统配置。你可以在此处对准确度作进一步了解。

  1. const million = 1000000;  
  2. const arr = Array(million); 
  3. console.time('⏳'); 
  4. for (let i = arr.length; i > 0; i--) {} // for(倒序)  :- 1.5ms 
  5. for (let i = 0; i < arr.length; i++) {} // for          :- 1.6ms 
  6. arr.forEach(v => v)                     // foreach      :- 2.1ms 
  7. for (const v of arr) {}                 // for...of     :- 11.7ms 
  8. console.timeEnd('⏳'); 

造成这样结果的原因很简单,在代码中,正序和倒序的 for 循环几乎花费一样的时间,仅仅相差了 0.1 毫秒。原因是,for(倒序)只需要计算一次起始变量 let i = arr.length,而在正序的 for 循环中,它在每次变量增加后都会检查条件 i

而 forEach 是 Array 原型的一个方法,与普通的 for 循环相比,forEach 和 for…of 需要花费更多的时间进行数组迭代。(译者注:但值得注意的是,for…of 和 forEach 都从对象中获取了数据,而原型并没有,因此没有可比性。)

循环的类型,以及我们应该在何处使用它们

1. For 循环(正序和倒序)

我想,也许大家都应该对这个基础循环非常熟悉了。我们可以在任何我们需要的地方使用 for 循环,按照核定的次数运行一段代码。最基础的 for 循环运行最迅速的,那我们每一次都应该使用它,对吗?并不然,性能不仅仅只是唯一尺度,代码可读性往往更加重要,就让我们选择适合我们应用程序的变形即可。

2. forEach

这个方法需要接受一个回调函数作为输入参数,遍历数组的每一个元素,并执行我们的回调函数(以元素本身和它的索引(可选参数)作为参数赋予给回调函数)。forEach 还允许在回调函数中使用一个可选参数 this。

  1. const things = ['have', 'fun', 'coding']; 
  2. const callbackFun = (item, idex) => { 
  3.     console.log(`${item} - ${index}`); 
  4. things.foreach(callbackFun);  
  5.  

3. for…of

for…of 是在 ES6(ECMAScript 6)中实现标准化的。它会对一个可迭代的对象(例如 array、map、set、string 等)创建一个循环,并且有一个突出的优点,即优秀的可读性。

  1. const arr = [3, 5, 7]; 
  2. const str = 'hello'
  3. for (let i of arr) { 
  4.    console.log(i); // 输出 3, 5, 7 
  5. for (let i of str) { 
  6.    console.log(i); // 输出 'h', 'e', 'l', 'l', 'o' 

需要注意的是,请不要在生成器中使用 for……of,即便 for……of 循环提前终止。在退出循环后,生成器被关闭,并尝试再次迭代,不会产生任何进一步的结果。

4. for in

for…in 会在对象的所有可枚举属性上迭代指定的变量。对于每个不同的属性,for…in 语句除返回数字索引外,还将返回用户定义的属性的名称。因此,在遍历数组时最好使用带有数字索引的传统 for 循环。因为 for…in 语句还会迭代除数组元素之外的用户定义属性,就算我们修改了数组对象(例如添加自定义属性或方法),依然如此。

  1. const details = {firstName: 'john', lastName: 'Doe'}; 
  2. let fullName = ''
  3. for (let i in details) { 
  4.     fullName += details[i] + ' '; // fullName: john doe 

for…of 和 for…in

for…of 和 for…in 之间的主要区别是它们迭代的内容。for…in 循环遍历对象的属性,而 for…of 循环遍历可迭代对象的值。

  1. let arr= [4, 5, 6]; 
  2. for (let i in arr) { 
  3.    console.log(i); // '0', '1', '2' 
  4. for (let i of arr) { 
  5.    console.log(i); // '4', '5', '6' 

结论

 

来源:code秘密花园内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯