JavaScript 中哪一种循环最快呢?

news/2024/7/19 15:34:05 标签: js, javascript, 循环, 数组

究竟哪一种循环更快?

答案其实是: for(倒序)

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

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

javascript">const million = 1000000; 
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 循环相比,forEach 和 for…of 需要花费更多的时间进行数组迭代。(译者注:但值得注意的是,for…offorEach 都从对象中获取了数据,而原型并没有,因此没有可比性。)

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

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

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

2. forEach

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

javascript">const things = ['have', 'fun', 'coding'];
const callbackFun = (item, idex) => {
    console.log(`${item} - ${index}`);
}
things.foreach(callbackFun); 
/* 输出 	
have - 0
fun - 1
coding - 2 
*/

3. for…of

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

javascript">const arr = [3, 5, 7];
const str = 'hello';
for (let i of arr) {
   console.log(i); // 输出 3, 5, 7
}
for (let i of str) {
   console.log(i); // 输出 'h', 'e', 'l', 'l', 'o'
}

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

4. for in

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

javascript">const details = {firstName: 'john', lastName: 'Doe'};
let fullName = '';
for (let i in details) {
    fullName += details[i] + ' '; // fullName: john doe
}
for…offor…in

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

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

结论

  • for 最快,但可读性比较差
  • foreach 比较快,能够控制内容
  • for...of 比较慢,但香
  • for...in 比较慢,没那么方便

http://www.niftyadmin.cn/n/658216.html

相关文章

2006年互联网七大趋势观察:Web2.0将受挫 [转]

转自&#xff1a;csdn管理频道 原文地址&#xff1a;http://manager.csdn.net/n/20060120/85907.html 趋势观察一&#xff1a;评论搜索 第一个重要趋势就是搜索用户自己产生的内容。2005年称得上是博客搜索引擎之年。互联网领域对于博客信息的挖掘是如此地关注&#xff0c;以…

Linux关机指令

https://www.cnblogs.com/zhangbing12304/p/8185346.html转载于:https://www.cnblogs.com/ranchosevens/p/10699512.html

asp下闰年计算方法

计算闰年主要是为了判断2月份的天数&#xff0c;一般闰年2月份是29天&#xff0c;平年2月份是28天。计算闰年的算法非常简单&#xff0c;即&#xff1a;能被400整除&#xff0c;或者能被4整除而不能被100整除。 算法如下&#xff1a; function isLeapYear(pYear) set oregn…

周笔畅征服Fans的杀手锏

湖南卫视的超级女生节目&#xff0c;在&#xff12;&#xff10;&#xff10;&#xff15;年可谓是轰动一时&#xff0c;不仅为湖南卫视赚得大把的钞票&#xff0c;同时也捧红了几个小女孩&#xff0c;李宇春、周笔畅、张靓颖、何洁、纪敏佳等。发展到现在&#xff0c;我们可以…

[计蒜客] n 子棋

n 子棋 Description 小 A 和小 B 在玩 nn 子棋&#xff0c; nn 子棋游戏的规则是&#xff0c;两人在一个左上角是 (1,1)(1,1)&#xff0c;右下角是 (n,n)(n,n) 的 n \times nnn 棋盘中交替落子&#xff0c;只要有一方的 nn 个棋子在同一行或者同一列或者同一条对角线上&#xf…

哲理小故事搜集

1、有一位表演大师上场前&#xff0c;他的弟子告诉他鞋带松了。大师点头致谢&#xff0c;蹲下来仔细系好。等到弟子转身后&#xff0c;又蹲下来将鞋带解松。有个旁观者不解地问&#xff1a;“大师&#xff0c;您为什么又要将鞋带解松呢&#xff1f;”大师回答道&#xff1a;“因…

似然估计---后验概率

贝叶斯估计&#xff1a;利用抽到的样本来修正先验估计&#xff0c;贝叶斯公式就是在描述&#xff0c;你有多大把握能相信一件证据&#xff1f; MAP就是多个作为因子的先验概率P(θ)。或者&#xff0c;也可以反过来&#xff0c;认为MLE是把先验概率P(θ)认为等于1&#xff0c;即…

拜年了!

在此新春佳节到来之际&#xff0c;我代表我自己向全国人民&#xff08;此处指大陆&#xff09;、台湾同胞、港澳同胞、海外侨胞拜年&#xff0c;向全国的公安干警解放军指战员武警官兵拜年&#xff0c;祝大家春节快乐&#xff0c;万事如意&#xff01; 注意&#xff1a;台湾同…