可以借用下面12种方法对数组求和,创建一个长度为10w的数组,进行测试

  • every()       检测数值元素的每个元素是否都符合条件。
  • filter()      检测数值元素,并返回符合条件所有元素的数组。
  • map()        通过指定函数处理数组的每个元素,并返回处理后的数组。
  • some()       用于检测数组中的元素是否满足指定条件(函数提供)。
  • reduce()       数组中的每个值(从左到右)开始合并,最终为一个值
  • reduceRight()    数组中的每个值(从右到左)开始合并,最终为一个值
  • eval()         计算 JavaScript 字符串,并把它作为脚本代码来执行。
  • for            循环代码块一定的次数
  • while         当指定的条件为 true 时循环指定的代码块
  • do/while       同样当指定的条件为 true 时循环指定的代码块
  • for in         循环遍历对象的属性
  • forEach      调用数组中的每个元素。

  具体实现:

    首先创建一个庞大的数组:

    var aArr = [];

    for(var i = 0;i < 1000000;i++){

     aArr.push(i);

      }

  

  1. (function(){
  2. //every
  3. var _sum = 0;
  4. console.time('every求和时间');
  5. aArr.every(function(item,index){
  6. _sum += item;
  7. return true;//every每个值都运行
  8. })
  9. console.log('every求和: '+_sum);
  10. console.timeEnd('every求和时间');
  11.  
  12. //filter
  13. var _sum = 0;
  14. console.time('filter求和时间');
  15. aArr.filter(function(item,index){
  16. _sum += item;
  17. })
  18. console.log('filter求和: '+_sum);
  19. console.timeEnd('filter求和时间');
  20.  
  21. //map
  22. var _sum = 0;
  23. console.time('map求和时间');
  24. aArr.map(function(item,index){
  25. _sum += item;
  26. })
  27. console.log('map求和: '+_sum);
  28. console.timeEnd('map求和时间');
  29.  
  30. //some
  31. var _sum = 0;
  32. console.time('some求和时间');
  33. aArr.some(function(item,index){
  34. _sum += item;
  35. })
  36. console.log('some求和: '+_sum);
  37. console.timeEnd('some求和时间');
  38.  
  39. //reduce
  40. console.time('reduce求和时间');
  41. var prev;
  42. aArr.reduce(function(prev,item,index){
  43. prev += item;
  44. })
  45. console.log('reduce求和: '+_sum);
  46. console.timeEnd('reduce求和时间');
  47.  
  48. //reduceRight
  49. console.time('reduceRight求和时间');
  50. var next;
  51. aArr.reduceRight(function(next,item,index){
  52. prev += item;
  53. })
  54. console.log('reduceRight求和: '+_sum);
  55. console.timeEnd('reduceRight求和时间');
  56.  
  57. //eval
  58. console.time('eval求和时间');
  59. var _sum = eval(aArr.join('+'));
  60. console.log('eval求和: '+_sum);
  61. console.timeEnd('eval求和时间');
  62.  
  63. //for
  64. console.time('for(var i = 0,len = aArr.length;i < len;i++)求和时间');
  65. var _sum = 0;
  66. for(var i = 0,len = aArr.length;i < len;i++){
  67. _sum += i;
  68. }
  69. console.log('for求和: '+_sum);
  70. console.timeEnd('for(var i = 0,len = aArr.length;i < len;i++)求和时间');
  71.  
  72. console.time('for(var i = 0;i < aArr.length;i++)求和时间');
  73. var _sum = 0;
  74. for(var i = 0;i < aArr.length;i++){
  75. _sum += i;
  76. }
  77. console.log('for求和: '+_sum);
  78. console.timeEnd('for(var i = 0;i < aArr.length;i++)求和时间');
  79.  
  80. //while
  81. console.time('while求和时间');
  82. var _sum = 0,i = 0,_len = aArr.length;
  83. while(i < _len){
  84. _sum += aArr[i];
  85. i++;
  86. }
  87. console.log('while求和: '+_sum);
  88. console.timeEnd('while求和时间');
  89.  
  90. //do while
  91. console.time('do while求和时间');
  92. var _sum = 0,i = 0,_len = aArr.length;
  93. do{
  94. _sum += aArr[i];
  95. i++;
  96. }while(i < _len)
  97. console.log('do while求和: '+_sum);
  98. console.timeEnd('do while求和时间');
  99.  
  100. //forEach
  101. var _sum = 0;
  102. console.time('forEach求和时间');
  103. aArr.forEach(function(item,index){
  104. _sum += item;
  105. return true;//every每个值都运行
  106. })
  107. console.log('forEach求和: '+_sum);
  108. console.timeEnd('forEach求和时间');
  109. })()
  110. every求和: 4999950000
  111. every求和时间: 5.648193359375ms
  112. filter求和: 4999950000
  113. filter求和时间: 3.9560546875ms
  114. map求和: 4999950000
  115. map求和时间: 17.988037109375ms
  116. some求和: 4999950000
  117. some求和时间: 6.005126953125ms
  118. reduce求和: 4999950000
  119. reduce求和时间: 5.129150390625ms
  120. reduceRight求和: 4999950000
  121. reduceRight求和时间: 4.081787109375ms
  122. eval求和: 4999950000
  123. eval求和时间: 43.47314453125ms
  124. for求和: 4999950000
  125. for(var i = 0,len = aArr.length;i < len;i++)求和时间: 2.748046875ms

  126. for求和: 4999950000
  127. for(var i = 0;i < aArr.length;i++)求和时间: 5.08984375ms
  128. while求和: 4999950000
  129. while求和时间: 4.9140625ms
  130. do while求和: 4999950000
  131. do while求和时间: 4.52392578125ms
  132. forEach求和: 4999950000
  133. forEach求和时间: 4.5830078125ms

效率最快的也就是我们用的较多的for循环(红字),但是如果不注意for的优化写法,就会导致for性能的极大降低

 

js 数组求和,多种方法,并比较性能的更多相关文章

  1. Javascript数组求和的方法总结 以及由斐波那契数列得到的启发

    一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以 ...

  2. js数组求和

    array1.reduce(callbackfn[, initialValue]) callback : 函数执行在数组中每个值 initialValue : 对象作为第一个参数回调的第一次调用使用 ...

  3. js数组去重的方法(转)

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  4. js数组高阶方法reduce经典用法代码分享

    以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...

  5. JS —— 数组与字符串方法

    数组 1. 基本方法  1)Array.prototype.unshift(item1,item2,item3...) 描述: 在数组的前面添加元素,一次可以传入多个参数. 注意:元素会根据当前传入的 ...

  6. JS 数组常用的方法

    数组常用的方法: x.toString()方法:任何对象都有toString方法.        将任何对象转为字符串. 一般不主动调用,系统在需要时自动调用 x.valueOf()方法:同toStr ...

  7. js数组的forEach方法能不能修改数组的值

    如果要使用数组的forEach()方法对其改值时,需要直接通过arr[i]这种方式来更改. 请看下面代码: // 数组改值 let arr = [1,3,5,7,9]; arr.forEach(fun ...

  8. Js 数组的各种方法及操作

    一.数组去重 var arr = [0,1,20,3,0,45,6,0]; Array.prototype.unrepeat = function(){ var array = []; for(var ...

  9. js将伪数组转换为标准数组的多种方法

    在js中,数组是特殊的对象,凡是对象有的性质,数组都有,数组表示有序数据的集合,而对象表示无序数据的集合. 那伪数组是什么呢,当然它也是对象,伪数组一般具有以下特点: 按索引方式存储数据: 具有len ...

随机推荐

  1. 阿里云web播放器

    原文地址:https://help.aliyun.com/document_detail/51991.html?spm=5176.doc61109.6.703.ZTCYoi 一.概念说明 1. pla ...

  2. HTTP协议—— 简单认识TCP/IP协议(转载)

    原文地址(http://www.cnblogs.com/roverliang/p/5176456.html) 1.什么是TCP/IP  如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就 ...

  3. [emqttd] (EMQ)

    [emqttd] (EMQ)是采用Erlang语言开发,全面支持MQTT V3.1.1协议,支持集群和大规模连接的开源MQTT消息服务器. [emqttd]致力于发布一个基于Erlang/OTP语言平 ...

  4. Android横竖屏布局总结

      Android横竖屏要解决的问题应该就两个:一.布局问题;二.重新载入问题. 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你 ...

  5. 机器学习实战笔记7(Adaboost)

    1:简单概念描写叙述 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们须要简介几个概念. 1:弱学习器:在二分情况下弱分类器的错误率会低于50%. 事实 ...

  6. Sql學習資源

    http://blog.csdn.net/wltica/article/category/1324738/1 SQL Server 整体方案系列: 1. SQL Server 数据归档方案 2. SQ ...

  7. SecureCRT终端上使用spark-shell时按退格键无反应的解决方法

    问题:用SecureCRT远程连接至Spark集群,启动spark-shell却发现输错命令后却无法用退格键删除. 解决方法: 第一步: 在SecureCRT的菜单栏选择“OPtions(选项)”按钮 ...

  8. Atitit.词法分析的理论原理 part2

    Atitit.词法分析的理论原理 part2 1.  转换图1 1.1. 转换图是由程序流程图改进而成的.同样,转换图也可以等价地转换为程序流程图3 1.2. 2.2.3  构造词法分析器(2)流程程 ...

  9. POJ 2409 Let it Bead(Polya简单应用)

    Let it Bead 大意:给你m种颜色,n个珠子串起来.旋转跟反转同样算同样,问有多少种不同的涂色组合方式. 思路:Polya的简单应用. /*************************** ...

  10. C++语言基础(23)-拷贝构造函数

    当以拷贝的方式初始化一个对象时,会调用一个特殊的构造函数,就是拷贝构造函数(Copy Constructor). 例如: #include <iostream> #include < ...