JavaScript中哪种类型的循环最快?几种for循环对比


本文摘自PHP中文网,作者青灯夜游,侵删。

JavaScript 是 Web 开发领域的“常青树”。无论是 JavaScript 框架(如 Node.js、React、Angular、Vue 等),还是原生 JavaScript,都拥有非常庞大的粉丝基础。我们来谈谈现代 JavaScript 吧。循环一直是大多数编程语言的重要组成部分,而现代 JavaScript 为我们提供了许多迭代或循环值的方法。

但问题在于,我们是否真的知道哪种循环或迭代最适合我们的需求。for 循环有很多变形,例如 forfor(倒序)、for…offorEachfor…infor…await。本文将围绕这些展开讨论。

了解哪一种 for 循环或迭代器适合我们的需求,防止我们犯下一些影响应用性能的低级错误。

究竟哪一种循环更快?

答案其实是: for(倒序)

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

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

1

2

3

4

5

6

7

8

9

10

11

12

const million = 1000000;

const arr = Array(million);

 

// 注:这是稀疏数组,应该为其指定内容,否则不同方式的循环对其的处理方式会不同:

// const arr = [...Array(million)]

 

console.time('?');

for (let i = arr.length; i > 0; i--) {} // for(倒序)  :- 1.5ms

for (let i = 0; i < arr.length; i++) {} // for          :- 1.6ms

arr.forEach(v => v)                     // foreach      :- 2.1ms

for (const v of arr) {}                 // for...of     :- 11.7ms

console.timeEnd('?');

造成这样结果的原因很简单,在代码中,正序和倒序的 for 循环几乎花费一样的时间,仅仅相差了 0.1 毫秒。原因是,for(倒序)只需要计算一次起始变量 let i = arr.length,而在正序的 for 循环中,它在每次变量增加后都会检查条件 i<arr.length。这个细微的差别不是很重要,你可以忽略它。(译者注:在数据量小或对时间不敏感的代码上,我们大可忽略它,但是根据译者的测试,当数据量扩大,例如十亿,千亿等的数量级,差距就显著提升,我们就需要考虑时间对应用程序性能的影响了。)

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

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

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

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

2. forEach

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

1

2

3

4

5

6

7

8

const things = ['have', 'fun', 'coding'];

const callbackFun = (item, idex) => {

    console.log(`${item} - ${index}`);

}

things.foreach(callbackFun);

/* 输出   have - 0

        fun - 1

        coding - 2 */

需要注意的是,如果我们要使用 forEach,我们不能使用 JavaScript 的短路运算符(||、&&……),即不能在每一次循环中跳过或结束循环。

阅读剩余部分

相关阅读 >>

react高阶组件(装饰器)的介绍(代码示例)

详解使用 javascript 解析 url的方法

java和javascript啥关系

js中箭头函数和普通函数的区别是什么

javascript有几种方式为元素添加事件

javascript弹出框有哪些

ajax和javascript区别是什么

javascript如何改变文本内容

使用rxjs管理react应用状态的介绍

js如何判断字符串是否为空

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...