国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 詳解JavaScript中哪一種循環最快呢

詳解JavaScript中哪一種循環最快呢

2022-02-21 16:41Hoarfroster js教程

這篇文章主要介紹了詳解JavaScript中哪一種循環最快呢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

了解哪一種 for 循環或迭代器適合我們的需求,防止我們犯下一些影響應用性能的低級錯誤。

JavaScript 是 Web 開發領域的“常青樹”。無論是 JavaScript 框架(如 Node.js、React、Angular、Vue 等),還是原生 JavaScript,都擁有非常龐大的粉絲基礎。我們來談談現代 JavaScript 吧。循環一直是大多數編程語言的重要組成部分,而現代 JavaScript 為我們提供了許多迭代或循環值的方法。
但問題在于,我們是否真的知道哪種循環或迭代最適合我們的需求。for 循環有很多變形,例如 for、for(倒序)、for…of、forEach、for…in、for…await。本文將圍繞這些展開討論。

究竟哪一種循環更快?

答案其實是: for(倒序)

最讓我感到驚訝的事情是,當我在本地計算機上進行測試之后,我不得不接受 for(倒序)是所有 for 循環中最快的這一事實。下面我會舉個對一個包含超過一百萬項元素的數組執行一次循環遍歷的例子。
聲明:console.time() 結果的準確度在很大程度上取決于我們運行測試的系統配置。你可以在此處對準確度作進一步了解。

?
1
2
3
4
5
6
7
8
9
10
11
12
const million = 1000000;
const arr = Array(million);
 
// 注:這是稀疏數組,應該為其指定內容,否則不同方式的循環對其的處理方式會不同:
// 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。這個細微的差別不是很重要,你可以忽略它。(譯者注:在數據量小或對時間不敏感的代碼上,我們大可忽略它,但是根據譯者的測試,當數據量擴大,例如十億,千億等的數量級,差距就顯著提升,我們就需要考慮時間對應用程序性能的影響了。)
而 forEach 是 Array 原型的一個方法,與普通的 for 循環相比,forEach 和 for…of 需要花費更多的時間進行數組迭代。(譯者注:但值得注意的是,for…of 和 forEach 都從對象中獲取了數據,而原型并沒有,因此沒有可比性。)

循環的類型,以及我們應該在何處使用它們

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

我想,也許大家都應該對這個基礎循環非常熟悉了。我們可以在任何我們需要的地方使用 for 循環,按照核定的次數運行一段代碼。最基礎的 for 循環運行最迅速的,那我們每一次都應該使用它,對嗎?并不然,性能不僅僅只是唯一尺度,代碼可讀性往往更加重要,就讓我們選擇適合我們應用程序的變形即可。

2. forEach

這個方法需要接受一個回調函數作為輸入參數,遍歷數組的每一個元素,并執行我們的回調函數(以元素本身和它的索引(可選參數)作為參數賦予給回調函數)。forEach 還允許在回調函數中使用一個可選參數 this。

?
1
2
3
4
5
6
7
8
const things = ['have', 'fun', 'coding'];
const callbackFun = (item, idex) => {
  console.log(`${item} - ${index}`);
}
things.foreach(callbackFun);
/* 輸出  have - 0
    fun - 1
    coding - 2 */

需要注意的是,如果我們要使用 forEach,我們不能使用 JavaScript 的短路運算符,即不能在每一次循環中跳過或結束循環。

3. for…of

for…of 是在 ES6(ECMAScript 6)中實現標準化的。它會對一個可迭代的對象(例如 array、map、set、string 等)創建一個循環,并且有一個突出的優點,即優秀的可讀性。

?
1
2
3
4
5
6
7
8
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 語句還會迭代除數組元素之外的用戶定義屬性,就算我們修改了數組對象(例如添加自定義屬性或方法),依然如此。

?
1
2
3
4
5
const details = {firstName: 'john', lastName: 'Doe'};
let fullName = '';
for (let i in details) {
  fullName += details[i] + ' '; // fullName: john doe
}

for…of 和 for…in

for…of 和 for…in 之間的主要區別是它們迭代的內容。for…in 循環遍歷對象的屬性,而 for…of 循環遍歷可迭代對象的值。

?
1
2
3
4
5
6
7
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 比較慢,沒那么方便

最后,給你一條明智的建議 —— 優先考慮可讀性。尤其是當我們開發復雜的結構程序時,更需要這樣做。當然,我們也應該專注于性能。盡量避免增添不必要的、多余的花哨代碼,因為這有時可能對你的程序性能造成嚴重影響。祝你編碼愉快。

譯者注

在譯者的實際測試中,發現:

  • 不同瀏覽器甚至不同版本,結果會有不一樣(顛倒,例如 Firefox 對原生 for-loop 似乎不太友好,Safari 極度喜歡 while)
  • 不同平臺操作系統處理器,結果會有不一樣

到此這篇關于詳解JavaScript中哪一種循環最快呢的文章就介紹到這了,更多相關JavaScript哪一種循環最內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文地址:Which type of loop is fastest in JavaScript?
原文作者:kushsavani

原文鏈接:https://juejin.cn/post/6930973929452339213

延伸 · 閱讀

精彩推薦
  • js教程基于 Next.js 的 SSR/SSG 方案了解一下?

    基于 Next.js 的 SSR/SSG 方案了解一下?

    服務端渲染(SSR,Server Side Render)與客戶端渲染(CSR,Client Side Render)的核心區分點簡單來說就是完整的 HTML 文檔在服務端還是瀏覽器里組裝完成。...

    DYBOY4832021-12-27
  • js教程js實現隨機點名功能

    js實現隨機點名功能

    這篇文章主要為大家詳細介紹了js實現隨機點名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    等待的L先生5062021-12-16
  • js教程js實現鼠標切換圖片(無定時器)

    js實現鼠標切換圖片(無定時器)

    這篇文章主要為大家詳細介紹了js實現鼠標切換圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    楓思然8172022-01-10
  • js教程JS實現購物車中商品總價計算

    JS實現購物車中商品總價計算

    這篇文章主要為大家詳細介紹了JS實現購物車中商品總價的計算 ,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    endggl12042022-02-13
  • js教程微信小程序自定義支持圖片的彈窗

    微信小程序自定義支持圖片的彈窗

    這篇文章主要為大家詳細介紹了微信小程序自定義支持圖片的彈窗,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    歲末Zzz8422021-12-15
  • js教程three.js顯示中文字體與tween應用詳析

    three.js顯示中文字體與tween應用詳析

    這篇文章主要給大家介紹了關于three.js顯示中文字體與tween應用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習...

    郭志強10002021-12-24
  • js教程javascript中layim之查找好友查找群組

    javascript中layim之查找好友查找群組

    這篇文章主要介紹了javascript中layim之查找好友查找群組,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    踮腳敲代碼9182022-01-19
  • js教程js實現瀑布流布局(無限加載)

    js實現瀑布流布局(無限加載)

    這篇文章主要為大家詳細介紹了js實現瀑布流布局,無限加載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    噢,我明白了11142022-02-17
主站蜘蛛池模板: 国产一区二区三区在线观看免费 | 伊人99 | 国产成人99久久亚洲综合精品 | 欧美激情久久久 | 国产欧美日韩一区二区三区四区 | 亚洲午夜电影 | 精品乱子伦一区二区三区 | 欧美在线免费 | 激情网页| 羞涩网站 | 久久女人网 | 久久免费福利视频 | 99国产精品久久久久久久成人热 | 黄久久久 | 亚洲精品片 | 国产成人一区 | 天堂中文av | www.狠狠干 | 成人精品一区二区 | 欧美精品福利 | 黑人巨大精品欧美一区免费视频 | 四虎影视4hu4虎成人 | 成人免费黄色毛片 | 久久99精品视频在线观看 | 中文字幕 国产精品 | 综合精品久久久 | 久久国产精品一区二区三区 | 国产男女做爰免费网站 | 久久久久久国产精品美女 | 一级片欧美 | 亚洲啊v| 欧美怡红院视频一区二区三区 | 久久精品黄色 | 黄网站色 | 荷兰欧美一级毛片 | 亚洲精品一区二区网址 | 成人免费视频网站 | 伊人网站 | 亚洲一区在线视频 | 91麻豆精品国产91久久久久久久久 | 91精品国产色综合久久 |