JavaScript如何優(yōu)化邏輯判斷代碼詳解
前言
我們?nèi)粘J褂玫降倪壿嬇袛嗾Z(yǔ)句有 if...else...、switch...case...、do...while...等。
在簡(jiǎn)單場(chǎng)景下,我們可能對(duì)這些語(yǔ)法的性能沒(méi)有什么感覺(jué),但當(dāng)遇到復(fù)雜的業(yè)務(wù)場(chǎng)景時(shí),如果處理不善,就會(huì)出現(xiàn)大量的邏輯嵌套,可讀性差并且難以擴(kuò)展。
千里之行始于足下,編寫(xiě)高可維護(hù)性和高質(zhì)量的代碼,我們就需要從細(xì)節(jié)處入手,我們今天主要討論 JavaScript 中如何優(yōu)化邏輯判斷代碼。
嵌套層級(jí)優(yōu)化
function supply(fruit, quantity) {
const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
// 條件 1: 水果存在
if (fruit) {
// 條件 2: 屬于紅色水果
if (redFruits.includes(fruit)) {
console.log('紅色水果');
// 條件 3: 水果數(shù)量大于 10 個(gè)
if (quantity > 10) {
console.log('數(shù)量大于 10 個(gè)');
}
}
} else {
throw new Error('沒(méi)有水果啦!');
}
}
通過(guò)上面這個(gè)例子,我們可以看到:判斷流程中規(guī)中矩,符合現(xiàn)實(shí)世界的映射。但是,因代碼層層嵌套,導(dǎo)致閱讀和維護(hù)都存在困難。
如果傳入了 fruit 參數(shù),則每次執(zhí)行都至少需要經(jīng)過(guò)兩步 if 判斷,在性能上也存在問(wèn)題。
我們來(lái)對(duì)上面的代碼進(jìn)行一下優(yōu)化處理:
function supply(fruit, quantity) {
const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
if (!fruit) throw new Error('沒(méi)有水果啦'); // 條件 1: 當(dāng) fruit 無(wú)效時(shí),提前處理錯(cuò)誤
if (!redFruits.includes(fruit)) return; // 條件 2: 當(dāng)不是紅色水果時(shí),提前 return
console.log('紅色水果');
// 條件 3: 水果數(shù)量大于 10 個(gè)
if (quantity > 10) {
console.log('數(shù)量大于 10 個(gè)');
}
}
這里主要對(duì)嵌套層級(jí)做了優(yōu)化,提前終止掉了不符合的條件,將三層嵌套減少到了一層,簡(jiǎn)化了代碼結(jié)果結(jié)構(gòu),增強(qiáng)了可閱讀性。
多條件分支的優(yōu)化
相信我們很多人對(duì)下面這種代碼不陌生吧?(想想剛開(kāi)始寫(xiě)代碼那會(huì)啊)
function pick(color) {
// 根據(jù)顏色選擇水果
if (color === 'red') {
return ['apple', 'strawberry'];
} else if (color === 'yellow') {
return ['banana', 'pineapple'];
} else if (color === 'purple') {
return ['grape', 'plum'];
} else {
return [];
}
}
我們需要知道一點(diǎn)原則:if else 更適合于條件區(qū)間判斷,而 switch case 更適合于具體枚舉值的分支判斷。
我們使用 switch...case...進(jìn)行一下改寫(xiě):
function pick(color) {
// 根據(jù)顏色選擇水果
switch (color) {
case 'red':
return ['apple', 'strawberry'];
case 'yellow':
return ['banana', 'pineapple'];
case 'purple':
return ['grape', 'plum'];
default:
return [];
}
}
switch...case... 優(yōu)化之后的代碼看上去格式整齊,思路很清晰,但還是很冗長(zhǎng)。繼續(xù)優(yōu)化:
借助 Object 的 {key: value} 結(jié)構(gòu),我們可以在 Object 中枚舉所有的情況,然后將 key 作為索引,直接通過(guò) Object.key 或者 Object[key] 來(lái)獲取內(nèi)容:
const fruitColor = {
red: ['apple', 'strawberry'],
yellow: ['banana', 'pineapple'],
purple: ['grape', 'plum'],
}
function pick(color) {
return fruitColor[color] || [];
}
使用 Map 數(shù)據(jù)結(jié)構(gòu),真正的(key, value) 鍵值對(duì)結(jié)構(gòu):
const fruitColor = new Map()
.set('red', ['apple', 'strawberry'])
.set('yellow', ['banana', 'pineapple'])
.set('purple', ['grape', 'plum']);
function pick(color) {
return fruitColor.get(color) || [];
}
優(yōu)化之后,代碼更簡(jiǎn)潔、更容易擴(kuò)展。
為了更好的可讀性,還可以通過(guò)更加語(yǔ)義化的方式定義對(duì)象,然后使用 Array.filter 達(dá)到同樣的效果:
const fruits = [
{name: 'apple', color: 'red'},
{name: 'strawberry', color: 'red'},
{name: 'banana', color: 'yellow'},
{name: 'pineapple', color: 'yellow'},
{name: 'grape', color: 'purple'},
{name: 'plum', color: 'purple'}
];
function pick(color) {
return fruits.filter(f => f.color == color);
}
總結(jié)
上面使用的例子和手段都比較初級(jí),但是其中的思想?yún)s值得我們細(xì)品,希望大家能夠有所收獲!
到此這篇關(guān)于JavaScript如何優(yōu)化邏輯判斷代碼的文章就介紹到這了,更多相關(guān)JavaScript優(yōu)化邏輯判斷代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用HTML與JavaScript實(shí)現(xiàn)注冊(cè)頁(yè)面源碼
這篇文章主要給大家介紹了關(guān)于利用HTML與JavaScript實(shí)現(xiàn)注冊(cè)頁(yè)面的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家實(shí)現(xiàn)注冊(cè)頁(yè)面具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12
Js動(dòng)態(tài)添加復(fù)選框Checkbox的實(shí)例方法
Js動(dòng)態(tài)添加復(fù)選框Checkbox的實(shí)例方法,需要的朋友可以參考一下2013-04-04
Javascript中八種遍歷方法的執(zhí)行速度深度對(duì)比
關(guān)于數(shù)組或?qū)ο蟊闅v,相信很多人都沒(méi)有深入觀察過(guò)執(zhí)行效率。這是一個(gè)曾在群里吵翻天的話(huà)題,讀懂后你將成為遍歷效率話(huà)題的大師。下面這篇文章主要介紹了Javascript中八種遍歷方法執(zhí)行速度深度對(duì)比的相關(guān)資料,需要的朋友可以參考下。2017-04-04
Avalonjs雙向數(shù)據(jù)綁定與監(jiān)聽(tīng)的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了Avalonjs雙向數(shù)據(jù)綁定與監(jiān)聽(tīng)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06
微信小程序?qū)崿F(xiàn)瀑布流分頁(yè)滾動(dòng)加載
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)瀑布流分頁(yè)滾動(dòng)加載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
javascript學(xué)習(xí)小結(jié)之prototype
本系列博文主要談一些在 javascript 使用中經(jīng)常會(huì)混淆的高級(jí)應(yīng)用,包括: prototype, closure, scope, this關(guān)鍵字. 對(duì)于一個(gè)需要提高自己javascript水平的程序員,這些都是必須要掌握的,本節(jié)主要介紹prototype.2015-12-12
js有趣的非空判斷函數(shù) + ?? 實(shí)現(xiàn)
本文介紹了JS中空值合并操作符??的用法,包括如何使用它來(lái)判斷數(shù)據(jù)是否為“合法數(shù)據(jù)”,即非空字符串、非undefined和非null,下面就一起來(lái)了解一下,感興趣的可以了解一下2024-09-09

