溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript中循環(huán)之間的技術(shù)差異是怎樣的

發(fā)布時(shí)間:2021-09-30 14:36:04 來(lái)源:億速云 閱讀:120 作者:柒染 欄目:web開發(fā)

本篇文章為大家展示了JavaScript中循環(huán)之間的技術(shù)差異是怎樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

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

可枚舉的屬性

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

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

要點(diǎn):可枚舉的屬性都可以用for...in 遍歷出來(lái)。

舉個(gè)例子看看:

// 會(huì)出現(xiàn)在 for ... in 循環(huán)中 const gbols = {}; gbols.platform = "LogRocket";  Object.getOwnPropertyDescriptor(gbols, "platform");  // {value: "LogRocket", writable: true, enumerable: true, configurable: true}  for (const item in gbols) {    console.log(item) } // platform   // 不會(huì)出現(xiàn)在 for ... in 循環(huán)中 // 將 enumerable 設(shè)置為 false Object.defineProperty(gbols, 'role', {value: 'Admin', writable: true, enumerable: false})  for (const item in gbols) {   console.log(item) } // platform

可迭代的對(duì)象

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

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

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

const authors = ['小智', '小王', '小明', '小紅'];  // 與 for in 循環(huán)一起使用 fro (const author in authors) {   console.log(author) }  // 打印: 0,1,2,3  for (const author of authors) {   console.log(author) }  // 打?。盒≈?nbsp; 小王  小明   小紅

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

我們來(lái)看一下對(duì)authors變量的操作:

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

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

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

const authors = {   0: 'Jade',   1: 'Dafe',   2: 'Gbols',   3: 'Daniel' }

重要說(shuō)明:如果可以追溯到對(duì)象(或從對(duì)象原型鏈繼承它),因?yàn)閒or …in將以不特定的順序遍歷鍵。

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

ForEach 和 map 方法

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

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

考慮下面的代碼片段:

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

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

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

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

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

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

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

鏈?zhǔn)?/strong>

map可以使用鏈?zhǔn)讲僮鳎驗(yàn)閙ap返回的結(jié)果是一個(gè)數(shù)組。因此,可以立即對(duì)結(jié)果調(diào)用任何其他數(shù)組方法。換句話說(shuō),我們可以調(diào)用filter, reduce,  some等等。對(duì)于forEach,這是不可能的,因?yàn)榉祷氐闹凳莡ndefined。

性能

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

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

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


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

上述內(nèi)容就是JavaScript中循環(huán)之間的技術(shù)差異是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI