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