成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS 中 if / if...else...替換方式

_ivan / 2618人閱讀

摘要:復(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 == truetypeof 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)
JS的命名規(guī)則(變量的命名規(guī)則)

標(biāo)識(shí)符只能由字母、數(shù)字、下劃線和‘$’組成

數(shù)字不可以作為標(biāo)識(shí)符的首字符

對(duì)象屬性的命名規(guī)則

通過[]操作符為對(duì)象添加屬性時(shí),屬性名可以是任何字符串(包括只包含空格的字符串和空字符串);

通過.操作符為對(duì)象添加屬性時(shí),屬性名必須是合法的標(biāo)識(shí)符名稱;

如果屬性名包含非法的標(biāo)識(shí)符字符,則只能采用obj[“propertyName”]的形式;

如果屬性名是合法的標(biāo)識(shí)符,讀取時(shí)可采用obj.propertyNameobj[“propertyName”]的形式;

策略模式
策略模式:定義一系列的算法,把它們一個(gè)個(gè)封裝起來,目的就是將算法的使用與算法的實(shí)現(xiàn)分離開來

以下為常見的表單驗(yàn)證,用策略模式來構(gòu)建,替換if...else的方式

// html
用戶名: 密碼: 手機(jī)號(hào)碼:
// 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

相關(guān)文章

  • Vue.js-內(nèi)置指令

    摘要:如果一次判斷的是多個(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...

    zzbo 評(píng)論0 收藏0
  • vue.js入門教程之基礎(chǔ)語法

    摘要:與綁定數(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 處理...

    pumpkin9 評(píng)論0 收藏0
  • Babel從入門到插件開發(fā)

    摘要:最近的技術(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í)及使用。 ...

    Jinkey 評(píng)論0 收藏0
  • 徹底解決if else嵌套問題

    摘要:徹底解決嵌套問題開發(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ù)更方便...

    zhoutk 評(píng)論0 收藏0
  • handlebars.js模板引擎

    摘要:基于,可以在中導(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)部封裝好的功能。 ...

    SimpleTriangle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<