推薦閱讀:JavaScript學習筆記之數組的增、刪除、改、查
透過最近學習,越來越感覺到JavaScript的強大與魅力之處,光是數組一個知識點就讓我這樣的初學者折騰了很久。折騰是折騰,但還是很有效果的,這幾天的學習到的一些基本知識,就在自己的業務就用到了。頓感自信心爆棚,我也有一天能學會JavaScript。
別的不多說了,咱們今天一起來玩數組的求和,看看有哪些方法可以實現數組的求和。
陣列方法
JavaScript中陣列有很多種方法,下圖能更好的向你闡述JavaScript有多少種方法,作用是啥:
簡單點回顧一下前面學習的知識:
push():在陣列末端新增一個或多個元素
unshift(): 在陣列的開頭新增一個或多個元素
pop(): 刪除陣列最後一個元素
shift(): 刪除陣列第一個元素
sort(): 給陣列排序
reverse(): 顛倒數組項在數組中的位置
concat(): 合併陣列
slice(): 指定的位置開始刪除指定的陣列項,並且將刪除的陣列項建構成一個新陣列
splice(): 對一個陣列做刪除、插入和替換
indexOf(): 從前向後找出元素在陣列中位置
lastIndexOf(): 從後向前找出元素在陣列中位置
forEach()、every()、some()、filter()和map():陣列迭代
reduce(): 陣列中的每個值(由左至右)開始合併,最後為一個值
reduceRight(): 陣列中的每個值(從右到左)開始合併,最後為一個值
陣列求和
今天的用例,假設我們有一個這樣的陣列:
var arr = [0,1,2,3,4,5,6,7,8,9];
需要將陣列中的項值加起來0+1+2+3+4+5+6+7+8+9。我們應該怎麼做,或者有哪些方法可以實現。簡單的講,就是想辦法讓陣列項目一個一個加起來。那是不是就要用到數組的迭代呢?是不是也可以藉助這些方法來實現數組的求和呢?
for循環和while循環
首先想到的就是這兩種循環方法,這在上一節也嘗試過了。再囉嗦:
// 求和:for循环遍历数组arr (function() { var sum = 0; function getSum(array){ for (var i = 0; i < array.length; i++){ sum += parseInt(array[i]); } return sum; } console.time("getSum"); for (var i = 0; i < 1000000; i++){ sum = 0; getSum(arr); } console.timeEnd("getSum"); // 7877.155ms console.log("使用for循环:sum = " + sum); // 45 })();
再來換個while看看:
(function () { var sum = 0; function getSum(array) { var i = array.length; while (i--) { sum += parseInt(array[i]); } return sum; } console.time("getSum"); for (var i = 0; i < 1000000; i++) { var sum = 0; getSum(arr); } console.timeEnd("getSum"); // getSum: 7690.056ms console.log("使用while循环:sum=" + sum); // 使用while循环:sum=45 })();
除了古老的for和while迴圈之外,在ES5中還新增加了其他的陣列迭代方法,例如forEach()、every()、some()、filter()和map()等。而且這些方法都可以讓陣列中的每一個元素執行一次回呼函數。如果一來,只需要對這個回呼函數做一個陣列項的累加功能:
function getSum (item, index, array){ sum += item; }
forEach()方法
forEach()方法讓陣列每一項執行給定的回呼函數callbackfn。這樣,我們可以在回呼函數getSum做一個累加計算。
(function (){ var sum = 0; function getSum (item, index, array){ sum += item; } console.time("getSum"); for (var i = 0; i < 1000000; i++){ var sum = 0; arr.forEach(getSum); } console.timeEnd("getSum"); // getSum: 1348.212ms console.log("使用forEach循环:sum=" + sum); // 使用forEach循环:sum=45 })()
some()方法
(function (){ var sum = 0; function getSum (item, index, array){ sum += item; } console.time("getSum"); for (var i = 0; i < 1000000; i++){ var sum = 0; arr.some(getSum); } console.timeEnd("getSum"); // getSum: 1038.737ms console.log("使用some循环:sum=" + sum); // 使用some循环:sum=45 })()
map()方法
(function (){ var sum = 0; function getSum (item, index, array){ sum += item; } console.time("getSum"); for (var i = 0; i < 1000000; i++){ var sum = 0; arr.map(getSum); } console.timeEnd("getSum"); // getSum: 4568.558ms console.log("使用map循环:sum=" + sum); // 使用map循环:sum=45 })()
filter()方法
(function (){ var sum = 0; function getSum (item, index, array){ sum += item; } console.time("getSum"); for (var i = 0; i < 1000000; i++){ var sum = 0; arr.filter(getSum); } console.timeEnd("getSum"); // getSum: 1117.039ms console.log("使用filter循环:sum=" + sum); // 使用filter循环:sum=45 })()
every()方法
every()方法和前面幾種方法略有不同,因為every()方法只有數組中每一項執行回呼函數結果合部為true才會返回,不然就會返回false。因為在前面的回呼函數中,需要增加return true;
(function() { var sum = 0; function getSum(item, index, array) { sum += item; return true;//由于every方法是会在遇到回调函数返回的第一个false时停止遍历所以需要始终返回true }; console.time("getSum"); for (var i = 0; i < 1000000; i++){ sum = 0; arr.every(getSum); } console.timeEnd("getSum"); // 1028.892ms console.log("使用every循环:sum = " + sum); // 使用every循环:sum = 45 })();
reduce()和reduceRight()方法
reduce()和reduceRight()方法可以接受一個回調函數callbackfn作為累加器(accumulator),數組中的每個值(從左到右)開始合併,最終為一個值。這樣也能讓陣列每個元素累積起來,達到陣列求和的功能。
先建立一個累加器的回呼函數:
function getSum(preValue,curValue,index,array) { return preValue += curValue; }
同樣以前面的陣列為例:
function getSum(preValue,curValue,index, array) { return preValue + curValue; } console.time("getSum"); for (var i = 0; i < 1000000; i++){ sum = arr.reduce(getSum, 0) } console.timeEnd("getSum"); // 3257.201ms console.log("使用reduce循环:sum = " + sum); // 使用reduce循环:sum = 45
前面測試,reduce()方法所費時間最短,本篇在測試似乎所費時間最長,不知道在哪出錯了,還望有大神能指導迷津。
reduceRight()方法和reduce()方法一樣,只是他從陣列的右邊向左邊累加。
總結
一個一個操作下來,數組的求和基本上是透過數組遍歷來實現,那麼掌握了數組中各種遍歷的方法,就能輕鬆的實現數組的求和。雖然這些遍歷的方法能讓實現數組的求和,但是不同的方法對效能有所不同。文章中的範例可能無法完全闡述他們性能方面的對比,如果您有更好的建議歡迎分享。
以上內容是針對JavaScript學習筆記之數組求和方法的全部介紹,希望對大家有幫助!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),