欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年07月15日 13:50:36   作者:@ 以樂之名  
這篇文章主要介紹了JavaScript 中 if / if...else...替換方式 ,非常不錯,這篇文章是小編給大家做的一個方法匯總,感興趣的朋友一起看看吧

說說爛大街的if/if...else...,程序中用得最多的流程判斷語句。

對著曾經(jīng)滿屏的if/if...else...,心想能不能搞點事情,折騰點浪花浪里呀浪。

對頂著“這個需求很簡單,怎么實現(xiàn)我不管,明天上線”的程序猿,答案必須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不足的地方在于只能處理字符或者數(shù)字類型的變量,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);

優(yōu)點:代碼簡化,更加清爽,write less

缺點:復雜的三元運算符可讀性較差,需友好注釋

TIPS: 三元運算符后面不能帶return
// 錯誤用法,運算符號后不能帶return
bool ? return 1 : return 2;

邏輯判斷 and(&&)和or(||) 改寫if

原理:利用邏輯判斷的短路運算來實現(xiàn)

短路:&& 中第一個表達式為假就不會去處理第二個表達式,|| 則相反

// if為真
if (bool) {
 value = getYes();
}
// &&改版
bool && (value = getYes());

// if為假
if (!bool) {
 value = getNo();
}
bool || (value = getNo());

優(yōu)點:代碼簡化,更加清爽,write less

缺點:適用于簡單判斷邏輯,復雜的判斷運算可讀性較差,需友好注釋

TIPS:適用于沒有else的場景, 邏輯運算符后面不能帶return

// 錯誤用法,運算符號后不能帶return
boll || return true;

--------------------------------------------------------------------------------

知識點插播 —— (1)

1.三元運算符和邏輯運算符都有一層return作用,但不可作用于函數(shù)return語句,所以像以下這種用法都是錯誤的;

// 錯誤用法
function getResult(value) {
 value ? 'yes' : 'no';
}
var result = getResult(true); // 并不會有值返回
1.js邏輯運算中,0/""/null/false/undefined/NaN都會判為false,其它都為true;
2.很多開源代碼中可見if(!!attr),為什么不直接寫if(attr), 其實這是一種更嚴謹?shù)膶懛ǎ?!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:

1.判斷值需為確定值,如== ,其它如>=/<=/>/<不適用
2.條件作為對象屬性,需要注意對象屬性的讀取方式

--------------------------------------------------------------------------------

知識點插播 —— (2)

JS的命名規(guī)則(變量的命名規(guī)則)

•標識符只能由字母、數(shù)字、下劃線和‘$'組成
•數(shù)字不可以作為標識符的首字符

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

•通過[]操作符為對象添加屬性時,屬性名可以是任何字符串(包括只包含空格的字符串和空字符串);
•通過.操作符為對象添加屬性時,屬性名必須是合法的標識符名稱;
•如果屬性名包含非法的標識符字符,則只能采用obj[“propertyName”]的形式;
•如果屬性名是合法的標識符,讀取時可采用obj.propertyName或obj[“propertyName”]的形式;

--------------------------------------------------------------------------------

策略模式

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

以下為常見的表單驗證,用策略模式來構建,替換if...else的方式

// html
<form id = "registerForm" method="post" action="http://xxxx.com/api/register">
 用戶名:<input type="text" name="userName">
 密碼:<input type="text" name="password">
 手機號碼:<input type="text" name="phoneNumber">
 <button type="submit">提交</button>
</form>
// 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;
  }
 }
};
// 調用代碼
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: '請輸入正確的手機號碼格式'
 }]);
 var errorMsg = validator.start();
 return errorMsg;
}
registerForm.onsubmit = function() {
 var errorMsg = validataFunc();
 if (errorMsg) {
  alert(errorMsg);
  return false;
 }
}

•第一個部分是一組策略類,策略類封裝了具體的算法,并負責具體的計算過程;
•第二個部分是環(huán)境類Context,該Context接收客戶端的請求,隨后把請求委托給某一個策略類;

優(yōu)點:

1.有效避免多重條件選擇語句
2.提供了對外開放 - 封裝原則的完美支持,將方法封裝在獨立的strategy中,使得它們易于切換、易于理解、易于擴展。
3.復用性

缺點:

1.增加了策略類/對象的使用
2.使用策略模式,必須先了解所有的strategy,違反了最少知識原則

總結

以上所述是小編給大家介紹的JavaScript 中 if / if...else...替換方式 ,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

相關文章

  • 利用D3.js實現(xiàn)最簡單的柱狀圖示例代碼

    利用D3.js實現(xiàn)最簡單的柱狀圖示例代碼

    D3.js是一個基于數(shù)據(jù)操作文檔JavaScript庫。D3幫助你給數(shù)據(jù)帶來活力通過使用HTML、SVG和CSS。D3重視Web標準為你提供現(xiàn)代瀏覽器的全部功能,而不是給你一個專有的框架。最近在學習D3.js,這個例子是通過d3.js畫一個簡單的柱狀圖。下面來一起看看吧。
    2016-12-12
  • JS拖動鼠標畫出方框實現(xiàn)鼠標選區(qū)的方法

    JS拖動鼠標畫出方框實現(xiàn)鼠標選區(qū)的方法

    這篇文章主要介紹了JS拖動鼠標畫出方框實現(xiàn)鼠標選區(qū)的方法,涉及javascript鼠標事件及頁面元素樣式的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 小程序中如何繪制思維導圖詳解

    小程序中如何繪制思維導圖詳解

    小程序相信大家應該都很熟悉了,對于小程序的整個運營的方法,很多運營都比較關注,今天希望通過一個思維導圖,這篇文章主要給大家介紹了關于小程序中如何繪制思維導圖的相關資料,需要的朋友可以參考下
    2021-10-10
  • 微信小程序商城項目之側欄分類效果(1)

    微信小程序商城項目之側欄分類效果(1)

    這篇文章主要為大家詳細介紹了微信小程序實戰(zhàn)商城系列之側欄分類效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Echarts通過dataset數(shù)據(jù)集實現(xiàn)創(chuàng)建單軸散點圖

    Echarts通過dataset數(shù)據(jù)集實現(xiàn)創(chuàng)建單軸散點圖

    這篇文章主要為大家詳細介紹了Echarts如何通過dataset數(shù)據(jù)集實現(xiàn)創(chuàng)建單軸散點圖,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • 求js數(shù)組的最大值和最小值的四種方法

    求js數(shù)組的最大值和最小值的四種方法

    本篇文章主要介紹了求js數(shù)組的最大值和最小值的四種方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • javacript使用break內(nèi)層跳出外層循環(huán)分析

    javacript使用break內(nèi)層跳出外層循環(huán)分析

    這篇文章主要介紹了javacript使用break內(nèi)層跳出外層循環(huán)的用法,以實例形式對比分析了循環(huán)跳出break語句的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Javascript實現(xiàn)Vue跨組件通信的方法詳解

    Javascript實現(xiàn)Vue跨組件通信的方法詳解

    這篇文章主要為大家詳細介紹了Vue的跨組件通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Bootstrap按鈕組件詳解

    Bootstrap按鈕組件詳解

    按鈕組和下拉菜單組件一樣,需要依賴于button.js插件才能正常運作。通過本文給大家詳細介紹Bootstrap按鈕組件,感興趣的朋友一起學習吧
    2016-04-04
  • uniapp添加車牌組件的實現(xiàn)與使用

    uniapp添加車牌組件的實現(xiàn)與使用

    uniapp是2019年火爆的一個Dcloud開發(fā)跨平臺前端工具,下面這篇文章主要給大家介紹了關于uniapp添加車牌組件的實現(xiàn)與使用,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05

最新評論