詳解JavaScript 中 if / if...else...替換方式

說(shuō)說(shuō)爛大街的if/if...else...,程序中用得最多的流程判斷語(yǔ)句。
對(duì)著曾經(jīng)滿(mǎn)屏的if/if...else...,心想能不能搞點(diǎn)事情,折騰點(diǎn)浪花浪里呀浪。
對(duì)頂著“這個(gè)需求很簡(jiǎn)單,怎么實(shí)現(xiàn)我不管,明天上線(xiàn)”的程序猿,答案必須YES。
"Write Less, Do More",學(xué)習(xí)進(jìn)步的本質(zhì)就是為了更有效率地偷懶。
廢話(huà)說(shuō)完,直接上方法匯總,讓我們來(lái)一窺究竟:
switch改寫(xiě)if
// if 版本
var a = 1;
if(a > 1 && a < 5) {
return 1
} else if(a > 5 && a < 10){
return 5
}else{
return 10
}
// switch 改版
switch(true){
case (a > 1 && a < 5):
return 1
case (a > 5 && a < 10):
return 5
default:
return 10
}
以上代碼的switch...case...的用法實(shí)際使用不多,僅供參考。
一般case為常量時(shí)switch...case...用得較多。
選擇分支較多時(shí),建議選用switch…case可提高程序的效率,但switch...case不足的地方在于只能處理字符或者數(shù)字類(lèi)型的變量,if…else更加靈活,可用于判斷表達(dá)式是否成立,比如if(a+b>c),if…else的應(yīng)用范圍更廣。
三元運(yùn)算符改寫(xiě)if
// if 版本
if (bool) {
value = 1;
} else {
value = 2;
}
// 三元運(yùn)算符 版本
value = bool ? 1 : 2;
// 三元預(yù)算符 多個(gè)運(yùn)算需要括號(hào)包裹 此處用了逗號(hào)表達(dá)式
return typeof foo === 'object'?(console.log(1),1):(console.log(2),2);
優(yōu)點(diǎn):代碼簡(jiǎn)化,更加清爽,write less
缺點(diǎn):復(fù)雜的三元運(yùn)算符可讀性較差,需友好注釋
TIPS: 三元運(yùn)算符后面不能帶return // 錯(cuò)誤用法,運(yùn)算符號(hào)后不能帶return bool ? return 1 : return 2;
邏輯判斷 and(&&)和or(||) 改寫(xiě)if
原理:利用邏輯判斷的短路運(yùn)算來(lái)實(shí)現(xiàn)
短路:&& 中第一個(gè)表達(dá)式為假就不會(huì)去處理第二個(gè)表達(dá)式,|| 則相反
// if為真
if (bool) {
value = getYes();
}
// &&改版
bool && (value = getYes());
// if為假
if (!bool) {
value = getNo();
}
bool || (value = getNo());
優(yōu)點(diǎn):代碼簡(jiǎn)化,更加清爽,write less
缺點(diǎn):適用于簡(jiǎn)單判斷邏輯,復(fù)雜的判斷運(yùn)算可讀性較差,需友好注釋
TIPS:適用于沒(méi)有else的場(chǎng)景, 邏輯運(yùn)算符后面不能帶return
// 錯(cuò)誤用法,運(yùn)算符號(hào)后不能帶return boll || return true;
--------------------------------------------------------------------------------
知識(shí)點(diǎn)插播 —— (1)
1.三元運(yùn)算符和邏輯運(yùn)算符都有一層return作用,但不可作用于函數(shù)return語(yǔ)句,所以像以下這種用法都是錯(cuò)誤的;
// 錯(cuò)誤用法
function getResult(value) {
value ? 'yes' : 'no';
}
var result = getResult(true); // 并不會(huì)有值返回
1.js邏輯運(yùn)算中,0/""/null/false/undefined/NaN都會(huì)判為false,其它都為true;
2.很多開(kāi)源代碼中可見(jiàn)if(!!attr),為什么不直接寫(xiě)if(attr), 其實(shí)這是一種更嚴(yán)謹(jǐn)?shù)膶?xiě)法,!!attr會(huì)強(qiáng)制轉(zhuǎn)化為boolean類(lèi)型。typeof !!attr == true 比 typeof attr == true 更加嚴(yán)謹(jǐn)。
--------------------------------------------------------------------------------
對(duì)象屬性
// if版本
if (a == 1) {
return 'one';
} else if (a == 2) {
return 'two';
} else if (a == 3) {
return 'three';
} else {
return '';
}
// 對(duì)象屬性 改版
var ret = {
1: 'one',
2: 'two',
3: 'three'
};
return ret[a] ? ret[a] : '';
TIPS:
1.判斷值需為確定值,如== ,其它如>=/<=/>/<不適用
2.條件作為對(duì)象屬性,需要注意對(duì)象屬性的讀取方式
--------------------------------------------------------------------------------
知識(shí)點(diǎn)插播 —— (2)
JS的命名規(guī)則(變量的命名規(guī)則)
•標(biāo)識(shí)符只能由字母、數(shù)字、下劃線(xiàn)和‘$'組成
•數(shù)字不可以作為標(biāo)識(shí)符的首字符
對(duì)象屬性的命名規(guī)則
•通過(guò)[]操作符為對(duì)象添加屬性時(shí),屬性名可以是任何字符串(包括只包含空格的字符串和空字符串);
•通過(guò).操作符為對(duì)象添加屬性時(shí),屬性名必須是合法的標(biāo)識(shí)符名稱(chēng);
•如果屬性名包含非法的標(biāo)識(shí)符字符,則只能采用obj[“propertyName”]的形式;
•如果屬性名是合法的標(biāo)識(shí)符,讀取時(shí)可采用obj.propertyName或obj[“propertyName”]的形式;
--------------------------------------------------------------------------------
策略模式
策略模式:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),目的就是將算法的使用與算法的實(shí)現(xiàn)分離開(kāi)來(lái)
以下為常見(jiàn)的表單驗(yàn)證,用策略模式來(lái)構(gòu)建,替換if...else的方式
// html
<form id = "registerForm" method="post" action="http://xxxx.com/api/register">
用戶(hù)名:<input type="text" name="userName">
密碼:<input type="text" name="password">
手機(jī)號(hào)碼:<input type="text" name="phoneNumber">
<button type="submit">提交</button>
</form>
// js
// 策略對(duì)象
var strategies = {
isNoEmpty: function (value, errorMsg) {
if (value === '') {
return errorMsg;
}
},
isNoSpace: function (value, errorMsg) {
if (value.trim() === '') {
return errorMsg;
}
},
minLength: function (value, length, errorMsg) {
if (value.trim().length < length) {
return errorMsg;
}
},
maxLength: function (value, length, errorMsg) {
if (value.length > length) {
return errorMsg;
}
},
isMobile: function (value, errorMsg) {
if (!/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[7]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(value)) {
return errorMsg;
}
}
}
// 驗(yàn)證類(lèi)
var Validator = function() {
this.cache = [];
}
Validator.prototype.add = function(dom, rules) {
var self = this;
for(var i = 0, rule; rule = rules[i++];) {
(function(rule) {
var strategyAry = rule.strategy.split(':');
var errorMsg = rule.errorMsg;
self.cache.push(function() {
var strategy = strategyAry.shift();
strategyAry.unshift(dom.value);
strategyAry.push(errorMsg);
return strategies[strategy].apply(dom, strategyAry);
})
})(rule)
}
};
Validator.prototype.start = function() {
for(var i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
var errorMsg = validatorFunc();
if (errorMsg) {
return errorMsg;
}
}
};
// 調(diào)用代碼
var registerForm = document.getElementById('registerForm');
var validataFunc = function() {
var validator = new Validator();
validator.add(registerForm.userName, [{
strategy: 'isNoEmpty',
errorMsg: '用戶(hù)名不可為空'
}, {
strategy: 'isNoSpace',
errorMsg: '不允許以空白字符命名'
}, {
strategy: 'minLength:2',
errorMsg: '用戶(hù)名長(zhǎng)度不能小于2位'
}]);
validator.add(registerForm.password, [ {
strategy: 'minLength:6',
errorMsg: '密碼長(zhǎng)度不能小于6位'
}]);
validator.add(registerForm.phoneNumber, [{
strategy: 'isMobile',
errorMsg: '請(qǐng)輸入正確的手機(jī)號(hào)碼格式'
}]);
var errorMsg = validator.start();
return errorMsg;
}
registerForm.onsubmit = function() {
var errorMsg = validataFunc();
if (errorMsg) {
alert(errorMsg);
return false;
}
}
•第一個(gè)部分是一組策略類(lèi),策略類(lèi)封裝了具體的算法,并負(fù)責(zé)具體的計(jì)算過(guò)程;
•第二個(gè)部分是環(huán)境類(lèi)Context,該Context接收客戶(hù)端的請(qǐng)求,隨后把請(qǐng)求委托給某一個(gè)策略類(lèi);
優(yōu)點(diǎn):
1.有效避免多重條件選擇語(yǔ)句
2.提供了對(duì)外開(kāi)放 - 封裝原則的完美支持,將方法封裝在獨(dú)立的strategy中,使得它們易于切換、易于理解、易于擴(kuò)展。
3.復(fù)用性
缺點(diǎn):
1.增加了策略類(lèi)/對(duì)象的使用
2.使用策略模式,必須先了解所有的strategy,違反了最少知識(shí)原則
總結(jié)
以上所述是小編給大家介紹的JavaScript 中 if / if...else...替換方式 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- javascript 從if else 到 switch case 再到抽象
- JS中三目運(yùn)算符和if else的區(qū)別分析與示例
- js利用與或運(yùn)算符優(yōu)先級(jí)實(shí)現(xiàn)if else條件判斷表達(dá)式
- vue.js 使用v-if v-else發(fā)現(xiàn)沒(méi)有執(zhí)行解決辦法
- JavaScript If...Else 聲明
- jsp自定義標(biāo)簽之ifelse與遍歷自定義標(biāo)簽示例
- js 中的switch表達(dá)式使用示例
- JavaScript switch case 的用法實(shí)例[范圍]
- JavaScript中switch判斷容易犯錯(cuò)的一個(gè)細(xì)節(jié)
- 其實(shí)你可以少寫(xiě)點(diǎn)if else與switch(推薦)
相關(guān)文章
利用D3.js實(shí)現(xiàn)最簡(jiǎn)單的柱狀圖示例代碼
D3.js是一個(gè)基于數(shù)據(jù)操作文檔JavaScript庫(kù)。D3幫助你給數(shù)據(jù)帶來(lái)活力通過(guò)使用HTML、SVG和CSS。D3重視Web標(biāo)準(zhǔn)為你提供現(xiàn)代瀏覽器的全部功能,而不是給你一個(gè)專(zhuān)有的框架。最近在學(xué)習(xí)D3.js,這個(gè)例子是通過(guò)d3.js畫(huà)一個(gè)簡(jiǎn)單的柱狀圖。下面來(lái)一起看看吧。2016-12-12
JS拖動(dòng)鼠標(biāo)畫(huà)出方框?qū)崿F(xiàn)鼠標(biāo)選區(qū)的方法
這篇文章主要介紹了JS拖動(dòng)鼠標(biāo)畫(huà)出方框?qū)崿F(xiàn)鼠標(biāo)選區(qū)的方法,涉及javascript鼠標(biāo)事件及頁(yè)面元素樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
微信小程序商城項(xiàng)目之側(cè)欄分類(lèi)效果(1)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崙?zhàn)商城系列之側(cè)欄分類(lèi)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Echarts通過(guò)dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖
這篇文章主要為大家詳細(xì)介紹了Echarts如何通過(guò)dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
javacript使用break內(nèi)層跳出外層循環(huán)分析
這篇文章主要介紹了javacript使用break內(nèi)層跳出外層循環(huán)的用法,以實(shí)例形式對(duì)比分析了循環(huán)跳出break語(yǔ)句的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解
這篇文章主要為大家詳細(xì)介紹了Vue的跨組件通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
uniapp添加車(chē)牌組件的實(shí)現(xiàn)與使用
uniapp是2019年火爆的一個(gè)Dcloud開(kāi)發(fā)跨平臺(tái)前端工具,下面這篇文章主要給大家介紹了關(guān)于uniapp添加車(chē)牌組件的實(shí)現(xiàn)與使用,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05

