javascript
foreach 循环达到条件的第一次就停止_是否应该停止在JavaScript代码中使用forEach()?...
在本文中,我想概述一下標(biāo)準(zhǔn)的 for 循環(huán)和 forEach() 方法背后的區(qū)別,并對它們各自帶來的一些好處進(jìn)行評論。
作為免責(zé)聲明,請不要把標(biāo)題當(dāng)真。我寫這篇文章的目的是為了讓讀者了解缺點(diǎn),并提供一些關(guān)于什么時候可以或不可以使用 forEach() 的見解,僅此而已。
forEach如何工作
forEach 方法接受回調(diào)函數(shù)作為輸入,對于要迭代的數(shù)組中的每個元素,將執(zhí)行此回調(diào)函數(shù)。應(yīng)該注意的是,回調(diào)函數(shù)可以接受一些可選參數(shù)。它們包括傳遞給函數(shù)的當(dāng)前值,當(dāng)前值的相應(yīng)索引。forEach 函數(shù)還提供了一個可選的參數(shù),用于在你的回調(diào)函數(shù)中定義。
考慮以下代碼:
相應(yīng)的輸出為:
corgis - 0are - 1cool - 2短路
如果您不知道什么是短路,它指的是我們提前終止或跳過循環(huán)的一個迭代。當(dāng)我們在使用 forEach() 的時候,沒有辦法利用短路,在我們的循環(huán)的所有情況下,我們將忍受與數(shù)組大小有關(guān)的線性運(yùn)行時間。
我為什么要關(guān)心這個?想象一下,我們有10億個元素的未排序數(shù)組,而我們想找到某個元素。假設(shè)我們非常幸運(yùn),并在循環(huán)的第一次迭代中找到了這個元素。實(shí)際上,我們希望盡早返回,因?yàn)槲覀円呀?jīng)找到了我們想要的東西,但是在實(shí)現(xiàn) forEach() 的方式中,我們總是會遍歷剩下的元素。對于此類問題,我們可能會使用 .findIndex() 方法。
性能
在 forEach() 方法中,由于我們在每次迭代時都要調(diào)用一個回調(diào)函數(shù),所以我們產(chǎn)生了一個額外的作用域開銷,與原生的 for 循環(huán)相比會導(dǎo)致速度變慢。
與傳統(tǒng)的 for 循環(huán)相比,我們有一個初始化語句、一個在每次迭代中求值的條件語句和一個在循環(huán)體遞增后的執(zhí)行階段。相對于 forEach() 方法,我們必須在每次迭代時創(chuàng)建額外的函數(shù)調(diào)用,它的成本更低。
為了測試性能,我創(chuàng)建了一個計(jì)時器腳本,該腳本在初始化數(shù)組后跟蹤執(zhí)行時間。這兩個循環(huán)在其體內(nèi)都執(zhí)行了一個簡單的 O(1) 操作:
可讀性
在開發(fā)軟件時,創(chuàng)建可維護(hù)和可讀的代碼應(yīng)該是頭等大事。我認(rèn)為在代碼中繼續(xù)使用 forEach() 是為了提高可讀性。隨著方法鏈幾乎成為JavaScript中數(shù)組的第二天性,使用 forEach() 循環(huán)來運(yùn)行數(shù)組,而不是 for 循環(huán),這樣讀起來會更好。
還應(yīng)該注意的是,像上面的例子中的輸入尺寸非常大的情況,往往不太可能出現(xiàn)。在合理的輸入大小下,這兩個回路的性能相對相同。
你是否愿意以犧牲可讀性為代價,以更快的速度執(zhí)行幾毫秒的功能?
如果對你有所啟發(fā)和幫助,可以點(diǎn)個關(guān)注、收藏、轉(zhuǎn)發(fā),也可以留言討論,這是對作者的最大鼓勵。
作者簡介:Web前端工程師,全棧開發(fā)工程師、持續(xù)學(xué)習(xí)者。
私信回復(fù):大禮包,送某網(wǎng)精品視頻課程網(wǎng)盤資料,準(zhǔn)能為你節(jié)省不少錢!
總結(jié)
以上是生活随笔為你收集整理的foreach 循环达到条件的第一次就停止_是否应该停止在JavaScript代码中使用forEach()?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python选择某一行_Python常用
- 下一篇: easyui 调用dialog中的方法_