欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JavaScript中哪一種循環(huán)最快呢

 更新時(shí)間:2021年03月24日 09:40:25   作者:Hoarfroster  
這篇文章主要介紹了詳解JavaScript中哪一種循環(huán)最快呢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

了解哪一種 for 循環(huán)或迭代器適合我們的需求,防止我們犯下一些影響應(yīng)用性能的低級錯(cuò)誤。

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

究竟哪一種循環(huán)更快?

答案其實(shí)是: for(倒序)

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

const million = 1000000; 
const arr = Array(million);

// 注:這是稀疏數(shù)組,應(yīng)該為其指定內(nèi)容,否則不同方式的循環(huán)對其的處理方式會不同:
// 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('⏳');

造成這樣結(jié)果的原因很簡單,在代碼中,正序和倒序的 for 循環(huán)幾乎花費(fèi)一樣的時(shí)間,僅僅相差了 0.1 毫秒。原因是,for(倒序)只需要計(jì)算一次起始變量 let i = arr.length,而在正序的 for 循環(huán)中,它在每次變量增加后都會檢查條件 i<arr.length。這個(gè)細(xì)微的差別不是很重要,你可以忽略它。(譯者注:在數(shù)據(jù)量小或?qū)r(shí)間不敏感的代碼上,我們大可忽略它,但是根據(jù)譯者的測試,當(dāng)數(shù)據(jù)量擴(kuò)大,例如十億,千億等的數(shù)量級,差距就顯著提升,我們就需要考慮時(shí)間對應(yīng)用程序性能的影響了。)
而 forEach 是 Array 原型的一個(gè)方法,與普通的 for 循環(huán)相比,forEach 和 for…of 需要花費(fèi)更多的時(shí)間進(jìn)行數(shù)組迭代。(譯者注:但值得注意的是,for…of 和 forEach 都從對象中獲取了數(shù)據(jù),而原型并沒有,因此沒有可比性。)

循環(huán)的類型,以及我們應(yīng)該在何處使用它們

1. For 循環(huán)(正序和倒序)

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

2. forEach

這個(gè)方法需要接受一個(gè)回調(diào)函數(shù)作為輸入?yún)?shù),遍歷數(shù)組的每一個(gè)元素,并執(zhí)行我們的回調(diào)函數(shù)(以元素本身和它的索引(可選參數(shù))作為參數(shù)賦予給回調(diào)函數(shù))。forEach 還允許在回調(diào)函數(shù)中使用一個(gè)可選參數(shù) this。

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

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

3. for…of

for…of 是在 ES6(ECMAScript 6)中實(shí)現(xiàn)標(biāo)準(zhǔn)化的。它會對一個(gè)可迭代的對象(例如 array、map、set、string 等)創(chuàng)建一個(gè)循環(huán),并且有一個(gè)突出的優(yōu)點(diǎn),即優(yōu)秀的可讀性。

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 循環(huán)提前終止。在退出循環(huán)后,生成器被關(guān)閉,并嘗試再次迭代,不會產(chǎn)生任何進(jìn)一步的結(jié)果。

4. for in

for…in 會在對象的所有可枚舉屬性上迭代指定的變量。對于每個(gè)不同的屬性,for…in 語句除返回?cái)?shù)字索引外,還將返回用戶定義的屬性的名稱。

因此,在遍歷數(shù)組時(shí)最好使用帶有數(shù)字索引的傳統(tǒng) for 循環(huán)。 因?yàn)?for…in 語句還會迭代除數(shù)組元素之外的用戶定義屬性,就算我們修改了數(shù)組對象(例如添加自定義屬性或方法),依然如此。

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 之間的主要區(qū)別是它們迭代的內(nèi)容。for…in 循環(huán)遍歷對象的屬性,而 for…of 循環(huán)遍歷可迭代對象的值。

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'
}

結(jié)論

  • for 最快,但可讀性比較差
  • foreach 比較快,能夠控制內(nèi)容
  • for...of 比較慢,但香
  • for...in 比較慢,沒那么方便

最后,給你一條明智的建議 —— 優(yōu)先考慮可讀性。尤其是當(dāng)我們開發(fā)復(fù)雜的結(jié)構(gòu)程序時(shí),更需要這樣做。當(dāng)然,我們也應(yīng)該專注于性能。盡量避免增添不必要的、多余的花哨代碼,因?yàn)檫@有時(shí)可能對你的程序性能造成嚴(yán)重影響。祝你編碼愉快。

譯者注

在譯者的實(shí)際測試中,發(fā)現(xiàn):

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

到此這篇關(guān)于詳解JavaScript中哪一種循環(huán)最快呢的文章就介紹到這了,更多相關(guān)JavaScript哪一種循環(huán)最內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

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

相關(guān)文章

  • document.write的幾點(diǎn)使用心得

    document.write的幾點(diǎn)使用心得

    一直用document.write()方法向?yàn)g覽器中顯示數(shù)據(jù)用,把它當(dāng)做Alert()使用, 看來這樣用有些大材小用了,下面說說它的主要用處。
    2014-05-05
  • 用簡單的腳本實(shí)現(xiàn)一款漂亮的下拉菜單

    用簡單的腳本實(shí)現(xiàn)一款漂亮的下拉菜單

    用簡單的腳本實(shí)現(xiàn)一款漂亮的下拉菜單...
    2006-12-12
  • 萬物皆可柯里化的Ramda.js及傳參詳解

    萬物皆可柯里化的Ramda.js及傳參詳解

    這篇文章主要為大家介紹了萬物皆可柯里化的Ramda.js詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • JavaScript簡單驗(yàn)證表單空值及郵箱格式的方法

    JavaScript簡單驗(yàn)證表單空值及郵箱格式的方法

    這篇文章主要介紹了JavaScript簡單驗(yàn)證表單空值及郵箱格式的方法,涉及javascript基本的表單與字符串操作相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • Bootstrap CSS組件之面包屑導(dǎo)航(breadcrumb)

    Bootstrap CSS組件之面包屑導(dǎo)航(breadcrumb)

    這篇文章主要為大家詳細(xì)介紹了Bootstrap CSS組件之面包屑導(dǎo)航(breadcrumb),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JavaScript canvas實(shí)現(xiàn)九宮格切圖效果

    JavaScript canvas實(shí)現(xiàn)九宮格切圖效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)九宮格切圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Js實(shí)現(xiàn)京東無延遲菜單效果實(shí)例(demo)

    Js實(shí)現(xiàn)京東無延遲菜單效果實(shí)例(demo)

    本篇文章主要介紹了Js實(shí)現(xiàn)京東無延遲菜單效果實(shí)例(demo) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 原生js實(shí)現(xiàn)移動開發(fā)輪播圖、相冊滑動特效

    原生js實(shí)現(xiàn)移動開發(fā)輪播圖、相冊滑動特效

    原生JS實(shí)現(xiàn)圖片自動輪播緩沖切換特效,很實(shí)用流暢的圖片輪播特效,在較現(xiàn)代的瀏覽器上展現(xiàn)的圓角效果,兼容差點(diǎn)的是直角效果,全部原生JS實(shí)現(xiàn),還是很不錯(cuò)的值得大家學(xué)習(xí)并利用,推薦下載。
    2015-04-04
  • JsonServer安裝及啟動過程圖解

    JsonServer安裝及啟動過程圖解

    這篇文章主要介紹了JsonServer安裝及啟動過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 讓html頁面不緩存js的實(shí)現(xiàn)方法

    讓html頁面不緩存js的實(shí)現(xiàn)方法

    這篇文章主要介紹了讓html頁面不緩存js的實(shí)現(xiàn)方法,分析了HTML頁面緩存js的原理,并由此分析實(shí)現(xiàn)不緩存js的方法,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10

最新評論