可以借用下面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性能的極大降低