自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對于 JavaScript 中循環(huán)之間的技術(shù)差異概述

開發(fā) 前端
在 JavaScript 中使用循環(huán)時,需要理解兩個關(guān)鍵點:可枚舉的屬性和可迭代的對象。

在 JavaScript 中使用循環(huán)時,需要理解兩個關(guān)鍵點:可枚舉的屬性和可迭代的對象。

[[343249]]

可枚舉的屬性

可枚舉對象的一個定義特征是,當(dāng)通過賦值操作符向?qū)ο蠓峙鋵傩詴r,我們將內(nèi)部 enumerable 標(biāo)志設(shè)置為true,這是默認(rèn)值。

當(dāng)然,我們可以通過將其設(shè)置為false來更改此行為。

要點:可枚舉的屬性都可以用for...in 遍歷出來。

舉個例子看看:

  1. // 會出現(xiàn)在 for ... in 循環(huán)中 
  2. const gbols = {}; 
  3. gbols.platform = "LogRocket"
  4.  
  5. Object.getOwnPropertyDescriptor(gbols, "platform"); 
  6.  
  7. // {value: "LogRocket", writable: true, enumerable: true, configurable: true} 
  8.  
  9. for (const item in gbols) { 
  10.    console.log(item) 
  11. // platform 
  12.  
  13.  
  14. // 不會出現(xiàn)在 for ... in 循環(huán)中 
  15. // 將 enumerable 設(shè)置為 false 
  16. Object.defineProperty(gbols, 'role', {value: 'Admin', writable: true, enumerable: false}) 
  17.  
  18. for (const item in gbols) { 
  19.   console.log(item) 
  20. // platform 

可迭代的對象

如果一個對象定義了它的迭代行為,那么它就是可迭代的。在這種情況下,將在for …of構(gòu)造中循環(huán)的值將定義其迭代行為??傻膬?nèi)置類型包括Arrays、Strings、Sets和Maps 。object 是不可迭代的,因為它沒有指定@iterator method。

在Javascript中,所有可迭代都是可枚舉的,但不是所有的可枚舉都是可迭代的。

for …in在數(shù)據(jù)中查找對象,而for ..of查找重復(fù)序列。來個例子看看:

  1. const authors = ['小智', '小王', '小明', '小紅']; 
  2.  
  3. // 與 for in 循環(huán)一起使用 
  4. fro (const author in authors) { 
  5.   console.log(author) 
  6.  
  7. // 打印: 0,1,2,3 
  8.  
  9. for (const author of authors) { 
  10.   console.log(author) 
  11.  
  12. // 打印:小智  小王  小明   小紅 

使用此構(gòu)造時,需要牢記的是,如果調(diào)用了 typeof 得到的類型是 object,則可以使用for…in循環(huán)。

我們來看一下對authors變量的操作:

  1. typeof authors 
  2.  
  3. // 打印的是 “object”,因此我們可以使用`for ..in` 

乍一看感覺有點奇怪,但必須注意,數(shù)組是一種特殊的對象,它以索引為鍵。for ...in循環(huán)找到對象時,它將循環(huán)遍歷每個鍵。

for …in 遍歷 authors 數(shù)組的方式可以用下面顯式化的方式來理解:

  1. const authors = { 
  2.   0: 'Jade', 
  3.   1: 'Dafe', 
  4.   2: 'Gbols', 
  5.   3: 'Daniel' 

重要說明:如果可以追溯到對象(或從對象原型鏈繼承它),因為for …in將以不特定的順序遍歷鍵。

同時,如果實現(xiàn) for.. of 構(gòu)造的迭代器,則它將在每次迭代中循環(huán)遍歷該值。

ForEach 和 map 方法

盡管可以使用forEach和map方法來實現(xiàn)相同的目標(biāo),但是它們的行為和性能方面存在差異。

基礎(chǔ)層面上,當(dāng)函數(shù)被調(diào)用時,它們都接收一個回調(diào)函數(shù)作為參數(shù)。

考慮下面的代碼片段:

  1. const scoresEach = [2,4 ,8, 16, 32]; 
  2. const scoresMap = [2,4 ,8, 16, 32]; 
  3. const square = (num) => num * num; 

我們逐一列出其操作上的一些差異。

forEach返回undefined,而map返回一個新數(shù)組:

  1. let newScores = [] 
  2. const resultWithEach = scoresEach.forEach((score) => { 
  3. const newScore = square(score); 
  4. newScores.push(newScore); 
  5. }); 
  6. const resultWithMap = scoresMap.map(square); 
  7.  
  8. console.log(resultWithEach) // undefined 
  9. console.log(resultWithMap) // [4, 16, 64, 256, 1024] 

map是一個純函數(shù),而forEach則執(zhí)行一些更改:

  1. console.log(newScores) // [4, 16, 64, 256, 1024] 

在我看來,map傾向于函數(shù)式編程范例。與forEach不同的是,我們并不總是需要執(zhí)行一次更改來獲得想要的結(jié)果,在forEach中,我們需要對newscore變量進(jìn)行更改。在每次運行時,當(dāng)提供相同的輸入時,map函數(shù)將產(chǎn)生相同的結(jié)果。同時,forEach對應(yīng)項將從最后一次更改的前一個值中獲取數(shù)據(jù)。

鏈?zhǔn)?/strong>

map可以使用鏈?zhǔn)讲僮?,因為map返回的結(jié)果是一個數(shù)組。因此,可以立即對結(jié)果調(diào)用任何其他數(shù)組方法。換句話說,我們可以調(diào)用filter, reduce, some等等。對于forEach,這是不可能的,因為返回的值是undefined。

性能

map 方法的性能往往優(yōu)于forEach方法。

檢查用map和forEach實現(xiàn)的等效代碼塊的性能。平均而言,map函數(shù)的執(zhí)行速度至少要快50%。

注意:此基準(zhǔn)測試取決于你使用的計算機以及瀏覽器的實現(xiàn)。

總結(jié)

在上面討論的所有循環(huán)結(jié)構(gòu)中,為我們提供最多控制的是for..of的循環(huán)。我們可以將它與關(guān)鍵字return、continue和break一起使用。這意味著我們可以指定我們希望對數(shù)組中的每個元素發(fā)生什么,以及我們是想早點離開還是跳過。

本文轉(zhuǎn)載自微信公眾號「大遷世界」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系大遷世界公眾號。

 

責(zé)任編輯:趙寧寧 來源: 大遷世界
相關(guān)推薦

2009-06-09 21:46:18

JavaScript差IEFirefox

2010-08-17 15:52:59

FirefoxIEJavaScript

2022-08-27 14:42:45

Java集合數(shù)組

2011-07-19 13:29:50

JavaScript

2017-01-20 08:30:19

JavaScriptfor循環(huán)

2022-01-12 15:50:24

JavaScript開發(fā)循環(huán)

2010-01-15 15:13:28

C++概述

2014-05-29 17:03:05

UnixLinux管理員

2014-09-11 17:02:41

綜合布線

2013-12-09 09:25:25

VMware vSAN

2021-07-14 10:58:47

SIMeSIMiSIM

2021-01-08 15:14:16

Python循環(huán)for循環(huán)

2009-12-18 16:51:41

ASP.NET概述

2024-08-30 08:43:24

JavaScriptforEachfor循環(huán)

2024-08-26 08:36:26

2011-06-17 10:26:29

PONEPONGPON

2009-08-28 10:08:02

C#數(shù)值類型之間轉(zhuǎn)換

2023-05-23 07:06:05

PythonPowerShell

2022-08-07 10:44:00

JSONPython對象

2010-03-19 10:31:00

網(wǎng)橋與交換機
點贊
收藏

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