摘要:復(fù)用性缺點(diǎn)增加了策略類對象的使用使用策略模式,必須先了解所有的,違反了最少知識原則參考資料設(shè)計模式之策略模式減少語句的技巧對象屬性的命名規(guī)則中和代替作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。
說說爛大街的if/if...else...,程序中用得最多的流程判斷語句。
對著曾經(jīng)滿屏的if/if...else...,心想能不能搞點(diǎn)事情,折騰點(diǎn)浪花浪里呀浪。
對頂著“這個需求很簡單,怎么實現(xiàn)我不管,明天上線”的程序猿,答案必須YES。
"Write Less, Do More",學(xué)習(xí)進(jìn)步的本質(zhì)就是為了更有效率地偷懶。
廢話說完,直接上方法匯總,讓我們來一窺究竟:
switch改寫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...的用法實際使用不多,僅供參考。
一般case為常量時switch...case...用得較多。
選擇分支較多時,建議選用switch…case可提高程序的效率,但switch...case不足的地方在于只能處理字符或者數(shù)字類型的變量,if…else更加靈活,可用于判斷表達(dá)式是否成立,比如if(a+b>c),if…else的應(yīng)用范圍更廣。
三元運(yùn)算符改寫if// if 版本 if (bool) { value = 1; } else { value = 2; } // 三元運(yùn)算符 版本 value = bool ? 1 : 2; // 三元預(yù)算符 多個運(yùn)算需要括號包裹 此處用了逗號表達(dá)式 return typeof foo === "object"?(console.log(1),1):(console.log(2),2);
優(yōu)點(diǎn):代碼簡化,更加清爽,write less
缺點(diǎn):復(fù)雜的三元運(yùn)算符可讀性較差,需友好注釋
TIPS: 三元運(yùn)算符后面不能帶return
// 錯誤用法,運(yùn)算符號后不能帶return bool ? return 1 : return 2;邏輯判斷 and(&&)和or(||) 改寫if
原理:利用邏輯判斷的短路運(yùn)算來實現(xiàn)
短路:&& 中第一個表達(dá)式為假就不會去處理第二個表達(dá)式,|| 則相反
// if為真 if (bool) { value = getYes(); } // &&改版 bool && (value = getYes()); // if為假 if (!bool) { value = getNo(); } bool || (value = getNo());
優(yōu)點(diǎn):代碼簡化,更加清爽,write less
缺點(diǎn):適用于簡單判斷邏輯,復(fù)雜的判斷運(yùn)算可讀性較差,需友好注釋
TIPS:適用于沒有else的場景, 邏輯運(yùn)算符后面不能帶return
// 錯誤用法,運(yùn)算符號后不能帶return boll || return true;知識點(diǎn)插播 —— (1)
三元運(yùn)算符和邏輯運(yùn)算符都有一層return作用,但不可作用于函數(shù)return語句,所以像以下這種用法都是錯誤的;
// 錯誤用法 function getResult(value) { value ? "yes" : "no"; } var result = getResult(true); // 并不會有值返回
js邏輯運(yùn)算中,0/""/null/false/undefined/NaN都會判為false,其它都為true;
很多開源代碼中可見if(!!attr),為什么不直接寫if(attr), 其實這是一種更嚴(yán)謹(jǐn)?shù)膶懛ǎ?b>!!attr會強(qiáng)制轉(zhuǎn)化為boolean類型。typeof !!attr == true 比 typeof attr == true 更加嚴(yán)謹(jǐn)。
對象屬性// if版本 if (a == 1) { return "one"; } else if (a == 2) { return "two"; } else if (a == 3) { return "three"; } else { return ""; } // 對象屬性 改版 var ret = { 1: "one", 2: "two", 3: "three" }; return ret[a] ? ret[a] : "";
TIPS:
判斷值需為確定值,如== ,其它如>=/<=/>/<不適用
條件作為對象屬性,需要注意對象屬性的讀取方式
知識點(diǎn)插播 —— (2)標(biāo)識符只能由字母、數(shù)字、下劃線和‘$’組成
數(shù)字不可以作為標(biāo)識符的首字符
通過[]操作符為對象添加屬性時,屬性名可以是任何字符串(包括只包含空格的字符串和空字符串);
通過.操作符為對象添加屬性時,屬性名必須是合法的標(biāo)識符名稱;
如果屬性名包含非法的標(biāo)識符字符,則只能采用obj[“propertyName”]的形式;
如果屬性名是合法的標(biāo)識符,讀取時可采用obj.propertyName或obj[“propertyName”]的形式;
策略模式策略模式:定義一系列的算法,把它們一個個封裝起來,目的就是將算法的使用與算法的實現(xiàn)分離開來
以下為常見的表單驗證,用策略模式來構(gòu)建,替換if...else的方式
// html// js // 策略對象 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; } } } // 驗證類 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: "用戶名不可為空" }, { strategy: "isNoSpace", errorMsg: "不允許以空白字符命名" }, { strategy: "minLength:2", errorMsg: "用戶名長度不能小于2位" }]); validator.add(registerForm.password, [ { strategy: "minLength:6", errorMsg: "密碼長度不能小于6位" }]); validator.add(registerForm.phoneNumber, [{ strategy: "isMobile", errorMsg: "請輸入正確的手機(jī)號碼格式" }]); var errorMsg = validator.start(); return errorMsg; } registerForm.onsubmit = function() { var errorMsg = validataFunc(); if (errorMsg) { alert(errorMsg); return false; } }
第一個部分是一組策略類,策略類封裝了具體的算法,并負(fù)責(zé)具體的計算過程;
第二個部分是環(huán)境類Context,該Context接收客戶端的請求,隨后把請求委托給某一個策略類;
優(yōu)點(diǎn):
有效避免多重條件選擇語句
提供了對外開放 - 封裝原則的完美支持,將方法封裝在獨(dú)立的strategy中,使得它們易于切換、易于理解、易于擴(kuò)展。
復(fù)用性
缺點(diǎn):
增加了策略類/對象的使用
使用策略模式,必須先了解所有的strategy,違反了最少知識原則
參考資料
JavaScript設(shè)計模式之策略模式
js減少if語句的技巧
js對象屬性的命名規(guī)則
javascript中||和&&代替if
作者:以樂之名
本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請指明出處。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96395.html
摘要:如果一次判斷的是多個元素,可以在內(nèi)置的元素上使用條件指令,最終渲染的結(jié)果不會包含該元素。列表渲染也支持用代替作為分隔符,它更接近迭代器的語法的表達(dá)式支持一個可選參數(shù)作為當(dāng)前項的索引。分隔符前的語句使用括號,第二項就是當(dāng)前項的索引。 學(xué)習(xí)筆記:內(nèi)置指令 內(nèi)置指令 基本指令 v-cloak v-cloak不需要表達(dá)式,它會在Vue實例結(jié)束編譯時從綁定的HTML元素上移除,經(jīng)常和CSS的d...
摘要:與綁定數(shù)據(jù)綁定一個常見需求是操作元素的列表和它的內(nèi)聯(lián)樣式。兩者只能選其一對象語法我們可以傳給一個對象,以動態(tài)地切換。注意不支持語法。相比之下,簡單得多元素始終被編譯并保留,只是簡單地基于切換。這意味著將分別重復(fù)運(yùn)行于每個循環(huán)中。 vue Class 與 Style 綁定 數(shù)據(jù)綁定一個常見需求是操作元素的 class 列表和它的內(nèi)聯(lián)樣式。因為它們都是屬性,我們可以用 v-bind 處理...
摘要:最近的技術(shù)項目里大量用到了需要修改源文件代碼的需求,也就理所當(dāng)然的用到了及其插件開發(fā)。在這里我要推薦一款實現(xiàn)了這些標(biāo)簽的插件,建議在你的項目中加入這個插件并用起來,不用再艱難的書寫三元運(yùn)算符,會大大提升你的開發(fā)效率。具體可以參見插件手冊。 最近的技術(shù)項目里大量用到了需要修改源文件代碼的需求,也就理所當(dāng)然的用到了Babel及其插件開發(fā)。這一系列專題我們介紹下Babel相關(guān)的知識及使用。 ...
摘要:徹底解決嵌套問題開發(fā)過程中常因為過多導(dǎo)致代碼融于,難以閱讀,今天就我們就一起來解決這個問題,讓代碼更優(yōu)美,維護(hù)更方便,接盤俠更開心有函數(shù)根據(jù)傳入水果類型返回顏色,代碼如下寫法一寫法二把同類放到一個中數(shù)組篩選內(nèi)多條件處理更早丟出不符合條件的資 徹底解決if else嵌套問題 開發(fā)過程中常因為if else過多導(dǎo)致代碼融于,難以閱讀,今天就我們就一起來解決這個問題,讓代碼更優(yōu)美,維護(hù)更方便...
摘要:基于,可以在中導(dǎo)入模板。利用對象函數(shù)替換對象或者運(yùn)行函數(shù)支持點(diǎn)語法可以對象等屬性值使用時,直接標(biāo)簽引入文件。模塊會自動匹配相應(yīng)的數(shù)值,對象或者是函數(shù)。也可以單獨(dú)建立一個模板,或者可以用來唯一確定一個模板,是固定寫法,不可或缺。 前言:常用的末班引擎有很多,但寫法都大同小異。handlebars.js就是一個純JS庫,因此你可以向其他腳本一樣用script包起來。調(diào)用內(nèi)部封裝好的功能。 ...
閱讀 3363·2021-10-13 09:40
閱讀 2601·2021-10-08 10:17
閱讀 4006·2021-09-28 09:45
閱讀 938·2021-09-28 09:35
閱讀 1819·2019-08-30 10:51
閱讀 2910·2019-08-26 12:11
閱讀 1655·2019-08-26 10:41
閱讀 3103·2019-08-23 17:10