js 数组求和,多种方法,并比较性能
可以借用下面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);
}
- (function(){
- //every
- var _sum = 0;
- console.time('every求和时间');
- aArr.every(function(item,index){
- _sum += item;
- return true;//every每个值都运行
- })
- console.log('every求和: '+_sum);
- console.timeEnd('every求和时间');
- //filter
- var _sum = 0;
- console.time('filter求和时间');
- aArr.filter(function(item,index){
- _sum += item;
- })
- console.log('filter求和: '+_sum);
- console.timeEnd('filter求和时间');
- //map
- var _sum = 0;
- console.time('map求和时间');
- aArr.map(function(item,index){
- _sum += item;
- })
- console.log('map求和: '+_sum);
- console.timeEnd('map求和时间');
- //some
- var _sum = 0;
- console.time('some求和时间');
- aArr.some(function(item,index){
- _sum += item;
- })
- console.log('some求和: '+_sum);
- console.timeEnd('some求和时间');
- //reduce
- console.time('reduce求和时间');
- var prev;
- aArr.reduce(function(prev,item,index){
- prev += item;
- })
- console.log('reduce求和: '+_sum);
- console.timeEnd('reduce求和时间');
- //reduceRight
- console.time('reduceRight求和时间');
- var next;
- aArr.reduceRight(function(next,item,index){
- prev += item;
- })
- console.log('reduceRight求和: '+_sum);
- console.timeEnd('reduceRight求和时间');
- //eval
- console.time('eval求和时间');
- var _sum = eval(aArr.join('+'));
- console.log('eval求和: '+_sum);
- console.timeEnd('eval求和时间');
- //for
- console.time('for(var i = 0,len = aArr.length;i < len;i++)求和时间');
- var _sum = 0;
- for(var i = 0,len = aArr.length;i < len;i++){
- _sum += i;
- }
- console.log('for求和: '+_sum);
- console.timeEnd('for(var i = 0,len = aArr.length;i < len;i++)求和时间');
- console.time('for(var i = 0;i < aArr.length;i++)求和时间');
- var _sum = 0;
- for(var i = 0;i < aArr.length;i++){
- _sum += i;
- }
- console.log('for求和: '+_sum);
- console.timeEnd('for(var i = 0;i < aArr.length;i++)求和时间');
- //while
- console.time('while求和时间');
- var _sum = 0,i = 0,_len = aArr.length;
- while(i < _len){
- _sum += aArr[i];
- i++;
- }
- console.log('while求和: '+_sum);
- console.timeEnd('while求和时间');
- //do while
- console.time('do while求和时间');
- var _sum = 0,i = 0,_len = aArr.length;
- do{
- _sum += aArr[i];
- i++;
- }while(i < _len)
- console.log('do while求和: '+_sum);
- console.timeEnd('do while求和时间');
- //forEach
- var _sum = 0;
- console.time('forEach求和时间');
- aArr.forEach(function(item,index){
- _sum += item;
- return true;//every每个值都运行
- })
- console.log('forEach求和: '+_sum);
- console.timeEnd('forEach求和时间');
- })()
- every求和: 4999950000
- every求和时间: 5.648193359375ms
- filter求和: 4999950000
- filter求和时间: 3.9560546875ms
- map求和: 4999950000
- map求和时间: 17.988037109375ms
- some求和: 4999950000
- some求和时间: 6.005126953125ms
- reduce求和: 4999950000
- reduce求和时间: 5.129150390625ms
- reduceRight求和: 4999950000
- reduceRight求和时间: 4.081787109375ms
- eval求和: 4999950000
- eval求和时间: 43.47314453125ms
- for求和: 4999950000
- for(var i = 0,len = aArr.length;i < len;i++)求和时间: 2.748046875ms
- for求和: 4999950000
- for(var i = 0;i < aArr.length;i++)求和时间: 5.08984375ms
- while求和: 4999950000
- while求和时间: 4.9140625ms
- do while求和: 4999950000
- do while求和时间: 4.52392578125ms
- forEach求和: 4999950000
- forEach求和时间: 4.5830078125ms
效率最快的也就是我们用的较多的for循环(红字),但是如果不注意for的优化写法,就会导致for性能的极大降低
js 数组求和,多种方法,并比较性能的更多相关文章
- Javascript数组求和的方法总结 以及由斐波那契数列得到的启发
一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以 ...
- js数组求和
array1.reduce(callbackfn[, initialValue]) callback : 函数执行在数组中每个值 initialValue : 对象作为第一个参数回调的第一次调用使用 ...
- js数组去重的方法(转)
JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...
- js数组高阶方法reduce经典用法代码分享
以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...
- JS —— 数组与字符串方法
数组 1. 基本方法 1)Array.prototype.unshift(item1,item2,item3...) 描述: 在数组的前面添加元素,一次可以传入多个参数. 注意:元素会根据当前传入的 ...
- JS 数组常用的方法
数组常用的方法: x.toString()方法:任何对象都有toString方法. 将任何对象转为字符串. 一般不主动调用,系统在需要时自动调用 x.valueOf()方法:同toStr ...
- js数组的forEach方法能不能修改数组的值
如果要使用数组的forEach()方法对其改值时,需要直接通过arr[i]这种方式来更改. 请看下面代码: // 数组改值 let arr = [1,3,5,7,9]; arr.forEach(fun ...
- Js 数组的各种方法及操作
一.数组去重 var arr = [0,1,20,3,0,45,6,0]; Array.prototype.unrepeat = function(){ var array = []; for(var ...
- js将伪数组转换为标准数组的多种方法
在js中,数组是特殊的对象,凡是对象有的性质,数组都有,数组表示有序数据的集合,而对象表示无序数据的集合. 那伪数组是什么呢,当然它也是对象,伪数组一般具有以下特点: 按索引方式存储数据: 具有len ...
随机推荐
- 阿里云web播放器
原文地址:https://help.aliyun.com/document_detail/51991.html?spm=5176.doc61109.6.703.ZTCYoi 一.概念说明 1. pla ...
- HTTP协议—— 简单认识TCP/IP协议(转载)
原文地址(http://www.cnblogs.com/roverliang/p/5176456.html) 1.什么是TCP/IP 如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就 ...
- [emqttd] (EMQ)
[emqttd] (EMQ)是采用Erlang语言开发,全面支持MQTT V3.1.1协议,支持集群和大规模连接的开源MQTT消息服务器. [emqttd]致力于发布一个基于Erlang/OTP语言平 ...
- Android横竖屏布局总结
Android横竖屏要解决的问题应该就两个:一.布局问题;二.重新载入问题. 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你 ...
- 机器学习实战笔记7(Adaboost)
1:简单概念描写叙述 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们须要简介几个概念. 1:弱学习器:在二分情况下弱分类器的错误率会低于50%. 事实 ...
- Sql學習資源
http://blog.csdn.net/wltica/article/category/1324738/1 SQL Server 整体方案系列: 1. SQL Server 数据归档方案 2. SQ ...
- SecureCRT终端上使用spark-shell时按退格键无反应的解决方法
问题:用SecureCRT远程连接至Spark集群,启动spark-shell却发现输错命令后却无法用退格键删除. 解决方法: 第一步: 在SecureCRT的菜单栏选择“OPtions(选项)”按钮 ...
- Atitit.词法分析的理论原理 part2
Atitit.词法分析的理论原理 part2 1. 转换图1 1.1. 转换图是由程序流程图改进而成的.同样,转换图也可以等价地转换为程序流程图3 1.2. 2.2.3 构造词法分析器(2)流程程 ...
- POJ 2409 Let it Bead(Polya简单应用)
Let it Bead 大意:给你m种颜色,n个珠子串起来.旋转跟反转同样算同样,问有多少种不同的涂色组合方式. 思路:Polya的简单应用. /*************************** ...
- C++语言基础(23)-拷贝构造函数
当以拷贝的方式初始化一个对象时,会调用一个特殊的构造函数,就是拷贝构造函数(Copy Constructor). 例如: #include <iostream> #include < ...