国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

無(wú)循環(huán) JavaScript(map、reduce、filter和find)

2024-05-06 15:18:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

之前有討論過(guò),縮進(jìn)(非常粗魯?shù)兀┰黾恿舜a復(fù)雜性。我們的目標(biāo)是寫(xiě)出復(fù)雜度低的 JavaScript 代碼。通過(guò)選擇一種合適的抽象來(lái)解決這個(gè)問(wèn)題,可是你怎么能知道選擇哪一種抽象呢?很遺憾的是到目前為止,沒(méi)有找到一個(gè)具體的例子能回答這個(gè)問(wèn)題。這篇文章中我們討論不用任何循環(huán)如何處理 JavaScript 數(shù)組,最終得出的效果是可以降低代碼復(fù)雜性。

循環(huán)是一種很重要的控制結(jié)構(gòu),它很難被重用,也很難插入到其他操作之中。另外,它意味著隨著每次迭代,代碼也在不斷的變化之中。——Luis Atencio

我們先前說(shuō)過(guò),像循環(huán)這樣的控制結(jié)構(gòu)引入了復(fù)雜性。但是也沒(méi)有給出確切的證據(jù)證明這一點(diǎn),我們先看看 JavaScript 中循環(huán)的工作原理。

循環(huán)

在 JavaScript 中,至少有四、五種實(shí)現(xiàn)循環(huán)的方法,最基礎(chǔ)的是 while 循環(huán)。我們首先先創(chuàng)建一個(gè)示例函數(shù)和數(shù)組:

// oodlify :: String -> Stringfunction oodlify(s) { return s.replace(/[aeiou]/g, 'oodle');}const input = [ 'John', 'Paul', 'George', 'Ringo',];

現(xiàn)在有了一個(gè)數(shù)組,我們想要用 oodlify 函數(shù)處理每一個(gè)元素。如果用 while 循環(huán),就類(lèi)似于這樣:

let i = 0;const len = input.length;let output = [];while (i < len) { let item = input[i]; let newItem = oodlify(item); output.push(newItem); i = i + 1;}

注意這里發(fā)生的事情,我們用了一個(gè)初始值為 0 的計(jì)數(shù)器 i,每次循環(huán)都會(huì)自增。而且每次循環(huán)中都和 len 進(jìn)行比較以保證循環(huán)特定次數(shù)以后終止循環(huán)。這種利用計(jì)數(shù)器進(jìn)行循環(huán)控制的模式太常用了,所以 JavaScript 提供了一種更加簡(jiǎn)潔的寫(xiě)法: for 循環(huán),寫(xiě)起來(lái)如下:

const len = input.length;let output = [];for (let i = 0; i < len; i = i + 1) { let item = input[i]; let newItem = oodlify(item); output.push(newItem);}

這一結(jié)構(gòu)非常有用,while循環(huán)非常容易把自增的 i 給忘掉,進(jìn)而引起無(wú)限循環(huán);而for循環(huán)把和計(jì)數(shù)器相關(guān)的代碼都放到了上面,這樣你就不會(huì)忘掉自增 i,這確實(shí)是一個(gè)很好的改進(jìn)。現(xiàn)在回到原來(lái)的問(wèn)題,我們目標(biāo)是在數(shù)組的每個(gè)元素上運(yùn)行 oodlify() 函數(shù),并且將結(jié)果放到一個(gè)新的數(shù)組中。

對(duì)一個(gè)數(shù)組中每個(gè)元素都進(jìn)行操作的這種模式也是非常普遍的。因此在 ES2015 中,引入了一種新的循環(huán)結(jié)構(gòu)可以把計(jì)數(shù)器也簡(jiǎn)化掉: for...of 循環(huán)。每一次返回?cái)?shù)組的下一個(gè)元素給你,代碼如下:

let output = [];for (let item of input) { let newItem = oodlify(item); output.push(newItem);}

這樣就清晰很多了,注意這里計(jì)數(shù)器和比較都不用了,你甚至都不用把元素從數(shù)組里面取出來(lái)。for...of 幫我們做了里面的臟活累活。如果現(xiàn)在用 for...of 來(lái)代替所有的 for 循環(huán),其實(shí)就可以很大程度上降低復(fù)雜性。但是,我們還可以做進(jìn)一步的優(yōu)化。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 广德县| 社会| 宜昌市| 库尔勒市| 高要市| 大厂| 宁南县| 依兰县| 理塘县| 平原县| 琼结县| 大厂| 清水县| 泰安市| 济南市| 商水县| 西充县| 博罗县| 桐柏县| 万安县| 库伦旗| 象州县| 观塘区| 翁源县| 通州区| 金堂县| 望都县| 武冈市| 高邑县| 尤溪县| 灵宝市| 泰安市| 开原市| 临泉县| 瑞昌市| 秦皇岛市| 安龙县| 中西区| 乾安县| 荔浦县| 宜川县|