成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 前端
最讓我感到驚訝的事情是,當(dāng)我在本地計(jì)算機(jī)上進(jìn)行測(cè)試之后,我不得不接受 for(倒序)是所有 for 循環(huán)中最快的這一事實(shí)。下面我會(huì)舉個(gè)對(duì)一個(gè)包含超過(guò)一百萬(wàn)項(xiàng)元素的數(shù)組執(zhí)行一次循環(huán)遍歷的例子。

[[391221]]

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

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

最讓我感到驚訝的事情是,當(dāng)我在本地計(jì)算機(jī)上進(jìn)行測(cè)試之后,我不得不接受 for(倒序)是所有 for 循環(huán)中最快的這一事實(shí)。下面我會(huì)舉個(gè)對(duì)一個(gè)包含超過(guò)一百萬(wàn)項(xiàng)元素的數(shù)組執(zhí)行一次循環(huán)遍歷的例子。

聲明:console.time() 結(jié)果的準(zhǔn)確度在很大程度上取決于我們運(yùn)行測(cè)試的系統(tǒng)配置。你可以在此處對(duì)準(zhǔn)確度作進(jìn)一步了解。

  1. const million = 1000000;  
  2. const arr = Array(million); 
  3. console.time('⏳'); 
  4. for (let i = arr.length; i > 0; i--) {} // for(倒序)  :- 1.5ms 
  5. for (let i = 0; i < arr.length; i++) {} // for          :- 1.6ms 
  6. arr.forEach(v => v)                     // foreach      :- 2.1ms 
  7. for (const v of arr) {}                 // for...of     :- 11.7ms 
  8. console.timeEnd('⏳'); 

造成這樣結(jié)果的原因很簡(jiǎn)單,在代碼中,正序和倒序的 for 循環(huán)幾乎花費(fèi)一樣的時(shí)間,僅僅相差了 0.1 毫秒。原因是,for(倒序)只需要計(jì)算一次起始變量 let i = arr.length,而在正序的 for 循環(huán)中,它在每次變量增加后都會(huì)檢查條件 i

而 forEach 是 Array 原型的一個(gè)方法,與普通的 for 循環(huán)相比,forEach 和 for…of 需要花費(fèi)更多的時(shí)間進(jìn)行數(shù)組迭代。(譯者注:但值得注意的是,for…of 和 forEach 都從對(duì)象中獲取了數(shù)據(jù),而原型并沒(méi)有,因此沒(méi)有可比性。)

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

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

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

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

3. for…of

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

  1. const arr = [3, 5, 7]; 
  2. const str = 'hello'
  3. for (let i of arr) { 
  4.    console.log(i); // 輸出 3, 5, 7 
  5. for (let i of str) { 
  6.    console.log(i); // 輸出 'h', 'e', 'l', 'l', 'o' 

需要注意的是,請(qǐng)不要在生成器中使用 for……of,即便 for……of 循環(huán)提前終止。在退出循環(huán)后,生成器被關(guān)閉,并嘗試再次迭代,不會(huì)產(chǎn)生任何進(jìn)一步的結(jié)果。

4. for in

for…in 會(huì)在對(duì)象的所有可枚舉屬性上迭代指定的變量。對(duì)于每個(gè)不同的屬性,for…in 語(yǔ)句除返回?cái)?shù)字索引外,還將返回用戶定義的屬性的名稱。因此,在遍歷數(shù)組時(shí)最好使用帶有數(shù)字索引的傳統(tǒng) for 循環(huán)。因?yàn)?for…in 語(yǔ)句還會(huì)迭代除數(shù)組元素之外的用戶定義屬性,就算我們修改了數(shù)組對(duì)象(例如添加自定義屬性或方法),依然如此。

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

for…of 和 for…in

for…of 和 for…in 之間的主要區(qū)別是它們迭代的內(nèi)容。for…in 循環(huán)遍歷對(duì)象的屬性,而 for…of 循環(huán)遍歷可迭代對(duì)象的值。

  1. let arr= [4, 5, 6]; 
  2. for (let i in arr) { 
  3.    console.log(i); // '0', '1', '2' 
  4. for (let i of arr) { 
  5.    console.log(i); // '4', '5', '6' 

結(jié)論

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

 

責(zé)任編輯:趙寧寧 來(lái)源: code秘密花園
相關(guān)推薦

2010-06-12 11:03:02

UML應(yīng)用

2014-09-10 10:04:37

程序員

2014-09-10 10:43:58

程序員

2017-11-13 12:01:31

開(kāi)發(fā)者編程編程風(fēng)格

2018-02-27 10:36:20

物聯(lián)網(wǎng)無(wú)線通信應(yīng)用程序

2010-12-20 11:12:31

企業(yè)網(wǎng)絡(luò)VPN

2021-07-25 20:22:04

容器技術(shù)計(jì)算

2018-01-05 08:53:32

LinuxUbuntu發(fā)行版

2023-03-30 15:28:24

2011-07-25 10:57:02

信息安全認(rèn)證IT安全學(xué)歷信息安全職業(yè)

2010-09-09 09:24:43

極客專屬人格技術(shù)狂人

2021-08-10 09:00:00

存儲(chǔ)容器硬件

2022-05-07 09:20:38

智能客服模塊方案

2021-03-23 12:25:40

區(qū)塊鏈穩(wěn)定幣以太坊

2011-07-27 13:03:09

2024-11-28 09:06:52

2021-01-06 08:05:32

JavaSocke粘包

2023-11-06 08:20:35

Kubernetesnginx

2009-08-14 09:50:24

2015-04-17 10:21:37

云存儲(chǔ)附加存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品视频在线 | 久色一区 | 中文字字幕在线中文乱码范文 | 日本a∨视频 | 91五月婷蜜桃综合 | av香港经典三级级 在线 | 国产欧美一区二区三区久久手机版 | 中文字幕一区二区三区日韩精品 | 性高朝久久久久久久3小时 av一区二区三区四区 | 91精品久久久久久久久久小网站 | 亚洲一区二区三区四区av | 免费看黄色片 | 久草视频在线播放 | 狠狠做深爱婷婷综合一区 | 在线第一页 | 日本高清不卡视频 | 久久国内精品 | 日韩中文字幕在线视频 | 国产一区二区三区在线 | 青青草网站在线观看 | 99久久99| 日韩精品一区二区三区在线观看 | 欧美老妇交乱视频 | 秋霞在线一区 | a级黄色网 | 日韩中文字幕免费在线观看 | 国产在线观 | 91中文视频| 人人叉 | 断背山在线观看 | 国产一区 在线视频 | 国产精品久久久久无码av | 日韩精品av一区二区三区 | 亚洲精品乱码久久久久久9色 | 日韩免费网站 | 国产亚洲一区二区精品 | 亚洲网站在线播放 | 午夜精 | 国产欧美日韩综合精品一区二区 | 99一区二区| www.狠狠干|