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