JavaScript代碼簡化技巧實例解析
函數(shù)式編程可以使您的代碼更簡單。簡單意味著代碼易于閱讀和理解,可測試和可維護。
在本文中,我描述了一些函數(shù)式編程(FP)技巧,您可以使用它們來簡化代碼,從而使代碼更好。
擺脫臨時變量和不變性原則
函數(shù)式編程傾向于不變性,這種不變性原則意味著在初始化變量之后不會更改它們的值。同樣,創(chuàng)建對象或字符串后,您也無需對其進行突變。
如果使用JavaScript編程,則所有變量定義都應(yīng)使用 const。對于正在閱讀您的代碼的任何人,常量定義都可以讓您高枕無憂:它保證永遠不會重新分配變量,因為重新分配是不可能的,所以讀者的大腦從跟蹤和識別代碼中重新分配的負(fù)擔(dān)中解脫出來。
何時需要更改值呢?首先,您可以擁有一個數(shù)組:
const fruits = ['apple', 'orange', 'banana']
要將新水果添加到此列表中,該怎么辦?解決方案是用新的或更新的值初始化一個新的常量變量,我們可以使用點擴展符復(fù)制現(xiàn)有的 fruits 值:
const allFruits = [...fruits, 'pineapple']
您應(yīng)該在代碼的任何地方都遵循不變性原則,因為如果這樣做,您的代碼將變得更干凈。
您知道 fruits 變量的值永遠不會改變,并且您第一次看到變量的聲明時就知道這一事實,初始化后,在任何可見的 fruits 變量處,您都知道。
擺脫循環(huán)
考慮以下循環(huán):
var list = []; var i = 0; while (i < rows.length) { var row = rows[i]; var message = { childAddress: row[1], action: 'switchToBackupNode2', role: 'edge' }; list.push(message); i += 1; }
函數(shù)編程方法去掉了while循環(huán),并使用map將行處理為一個列表。
const list = rows.map(r => ({ childAddress: r[1], action: 'switchToBackupNode2', role: 'edge' }))
除了擺脫循環(huán)之外,這段代碼還刪除了臨時變量 row 和 message 以及循環(huán)變量 i。
結(jié)果更具可讀性,非常清晰。
為了公平起見,要獲得此信任級別,您需要首先了解map函數(shù)。map函數(shù)在函數(shù)式編程中無處不在,因此學(xué)習(xí)它是過渡到FP的重要步驟。
map是程序員用于列表處理的函數(shù)之一。處理列表中的數(shù)據(jù)是FP的重要組成部分,您還應(yīng)該學(xué)習(xí)其他列表處理功能:最重要的是 reduce 和 filter 函數(shù)。
刪除if..else
在我的簡化代碼的實踐中,刪除 if 是一個有用的策略。有幾種策略可以用于從代碼中刪除 if 語句,并且應(yīng)用其中任何一種通常都會得到更清晰、更容易理解的結(jié)構(gòu)。
讓我們看一下刪除 if 語句的一些策略。
三元運算符
三元運算符是我從變量賦值中去掉 if 語句的主要工具。
考慮以下:
let message; if (person !== null) { message = `hello, ${person}!` } else { message = 'hey there!' }
上面的代碼中有兩個問題:
我必須使用非 const 變量 message,因為對于 if 結(jié)構(gòu),我無法在變量聲明中立即給 message 賦值。
考慮到它只完成了聲明變量和有條件地為變量賦值的簡單任務(wù),代碼相當(dāng)冗長和復(fù)雜。
使用三元運算符? 可以在一行中完成相同的工作:
const message = person !== null ? `hello, ${person}!` : 'hey there!'
布爾運算符 && 和 ||
布爾運算符 && 和 || 為 if 語句提供有效的替代方法。
不要這樣做:
if (value) {
doStuff(value)
} else {
doStuff(1)
}
改進:
doStuff(value || 1)
這里的邏輯或操作符 || 提供了向函數(shù)傳遞默認(rèn)值的快速方法。每次不知道或不確定變量是否具有值時,都可以使用相同的技巧:使用 || <default> 作為前綴提供默認(rèn)值。
這是一個如何使用邏輯與運算符 && 的示例。首先,使用 if 的版本:
if (data) {
sendData(data.value);
}
然后我們使用 && 刪除 if :
data && sendData(data.value)
在這里,我們使用 && 來首先檢查數(shù)據(jù)變量是否包含值。如果沒有這個檢查,當(dāng)沒有值時代碼就會崩潰(換句話說,值為 null 或 undefined)。
在這里使用這些運算符時,我們依賴布爾表達式的短路求值。&& 和 || 運算符,當(dāng)?shù)谝徊糠皱e誤時,JavaScript不會計算表達式的后半部分。
Map 和 查找
使用 map 作為查找 list 是替換一系列if語句的有效方法??紤]以下:
let language; if (country === 'FI') { language = 'Finnish' } else if (country === 'SE') { language = 'Swedish' } else if (country === 'USA') { language = 'English (American)' } else if (country === 'UK') { language = 'English (UK)' } // etc...
更簡潔的方法是使用國家/語言對的Map。
const languages = new Map([ ['FI', 'Finnish'], ['SE', 'Swedish'], ['USA', 'English (American)'], ['UK', 'English (UK)'], ]) const language = languages.get('SE') console.log(language) // Swedish
第二種實現(xiàn)要簡單得多。該代碼立即顯示出它的意圖。另外,它將 language 變量轉(zhuǎn)換為使用 const。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實現(xiàn)將數(shù)字金額轉(zhuǎn)換為大寫人民幣漢字的方法
這篇文章主要介紹了JS實現(xiàn)將數(shù)字金額轉(zhuǎn)換為大寫人民幣漢字的方法,涉及javascript字符串與數(shù)組操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08Javascript節(jié)流函數(shù)throttle和防抖函數(shù)debounce
這篇文章主要介紹了Javascript節(jié)流函數(shù)throttle和防抖函數(shù)debounce,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12