摘要:但是總是會被很多朋友說,這些人認(rèn)為的速度要比快一點(diǎn)。如果你想用函數(shù)式編程寫個(gè)鏈?zhǔn)奖磉_(dá)式來裝個(gè)逼,將會是你不二的選擇。來看下面這個(gè)例子鏈?zhǔn)斤L(fēng)格接不起來,斷了最后根據(jù)上面的代碼,大家應(yīng)該了解到跟的局限。
訪問原文地址
.map() vs .forEach() vs for()筆者說,自己基本沒怎么用過for()來遍歷,主要是用.forEach()。
但是總是會被很多朋友說,這些人認(rèn)為for()的速度要比.forEach()快一點(diǎn)。(其實(shí)這根本沒有根據(jù),下面會講)
速度當(dāng)然是很重要的,但是我們也需要從其他方面考慮一下,特別是代碼資源。
這里有一篇很棒的文章,很好的分析了for()遍歷。它同時(shí)也針對for()遍歷和.forEach()做了比對[測試](https://jsperf.com/for-vs-foreach/37)。for()與.forEach()`相比會消耗更多的內(nèi)存。
這樣,又回到了老問題,是用空間換速度,還是反之?
當(dāng)然,都很重要。首先,這2個(gè)方面都不會成為你代碼中的瓶頸問題。其次,那些小小的優(yōu)化技巧也不會很好的平衡這2個(gè)問題,只會增加你的工作量而已。那我在來看下可讀性、可控性、以及可維護(hù)性之間的對比呢。
讓我們先來看個(gè)基本的sample
比如這個(gè)數(shù)組
var arr = [1, 2, 3];
.map():
arr.map(fcuntion(i) { console.log(i); })
43個(gè)字母
.forEach():
arr.forEach(function(i){ console.log(i) })
47個(gè)字母
for()
for(var i=0,l=arr.lengrh;i70個(gè)字母
.map()和.forEach()明顯要簡短一些,并且他們的可讀性更強(qiáng),同時(shí)他們也創(chuàng)建了各自的scope,而for()在執(zhí)行完遍歷之后會把i和l這兩個(gè)元素掛起來,這讓我們需要手動(dòng)增加一些代碼去清除他們所占用的內(nèi)存。
所以,這時(shí)候可以告訴你的朋友:
用.forEach()或者.map()。
.map() vs .forEach()那么接下來,我繼續(xù)做分析,為什么更推薦用.map(),而不是.forEach()?
首先,.map()要比.forEach()執(zhí)行速度更快。雖然我也說過執(zhí)行速度不是我們需要考慮的主要因素,但是他們都比for()要更好用,那肯定要選更優(yōu)化的一個(gè)。
第二,.forEach()的返回值并不是array。如果你想用函數(shù)式編程寫個(gè)鏈?zhǔn)奖磉_(dá)式來裝個(gè)逼,.map()將會是你不二的選擇。
來看下面這個(gè)例子:
var arr = [1, 2, 3]; console.log( arr.map(function(i){ return i+i; }) //鏈?zhǔn)斤L(fēng)格 .sort() );// [2,4,6] console.log( arr.forEach(function(i){ return i+i; }) //接不起來,斷了 .sort() );//TypeError: Cannot read property "sort" of undefined最后根據(jù)上面的代碼,大家應(yīng)該了解到.forEach()跟.map()的局限。
最后,感謝大家耐心的閱讀,排個(gè)序
.map() > .forEach() > for()
英文原文https://ryanpcmcquen.org/javascript/2015/10/25/map-vs-foreach-vs-for.html
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/91156.html
摘要:在種和一樣都具有遍歷數(shù)組的功能,但是他們的返回結(jié)果并不相同,使用遍歷數(shù)組時(shí),無法使用中斷循環(huán),也無法使用中斷,當(dāng)然使用也不能返回到外層函數(shù)。枚舉對象循環(huán)不支持普通對象,如果想迭代一個(gè)對象的屬性,可以使用內(nèi)建的方法使用方法獲取對象的數(shù)組 先看下面這兩種寫法:1. tabList.forEach((tab, i) => { if (tab.is_main) { th...
摘要:示例下方提供了一個(gè)數(shù)組,如果我們想將其中的每一個(gè)元素翻倍,我們可以使用和來達(dá)到目的。注意,是不會返回有意義的值的。允許更改原始數(shù)組的元素。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,得到了金山軟件等眾多知名用戶的認(rèn)可。 譯者按: 慣用Haskell的我更愛map。 原文: JavaScript?—?Map vs. ForEach - What’s the difference bet...
摘要:比如對一個(gè)數(shù)據(jù)流進(jìn)行過濾映射以及求和運(yùn)算,通過使用延后機(jī)制,那么所有操作只要遍歷一次,從而減少中間調(diào)用。這里需知道中的元素都是延遲計(jì)算的,正因?yàn)榇耍軌蛴?jì)算無限數(shù)據(jù)流。 【編者按】在之前文章中,我們介紹了 Java 8和Scala的Lambda表達(dá)式對比。在本文,將進(jìn)行 Hussachai Puripunpinyo Java 和 Scala 對比三部曲的第二部分,主要關(guān)注 Stream...
摘要:數(shù)組優(yōu)化版優(yōu)化版谷歌版本正式版本位優(yōu)化版火狐版本優(yōu)化版結(jié)論這是一個(gè)尷尬的結(jié)論,谷歌火狐,同樣是最新版本或許谷歌才是王道,火狐跳舞吧,顫抖吧,你也太慢了吧,以谷歌為準(zhǔn)相對來說作為新的遍歷方法具有可觀的效率對象 數(shù)組 var arr = new Array(10000000); var arr1 = []; var arr2 = []; var arr3 =...
閱讀 1707·2021-10-09 09:44
閱讀 3269·2021-09-27 13:36
閱讀 1527·2021-09-22 15:33
閱讀 1282·2021-09-22 15:23
閱讀 1168·2021-09-06 15:02
閱讀 1706·2019-08-29 16:14
閱讀 2913·2019-08-29 15:26
閱讀 2414·2019-08-28 18:08