之前有討論過(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)化。
新聞熱點(diǎn)
疑難解答
圖片精選