JS不可不知的邏輯與(&&)或(||)非(!)。

最近重新翻開原生JS,又得到很多不同的體會,雖然現在開發框架那么多,但很多思想都還是離不開原生的基礎。今天呢,我就根據自己的學習總結一下邏輯與(&&)和邏輯或(||)和邏輯非(!)。

** 基本定義**
** ||**:邏輯或,只有表達式的值都為false,才返回false,其他情況返回true 比如:(8>5)&&(4<6),返回true;(8<5)&&(4<6),返回false。

** &&**:邏輯與,若兩邊表達式的值都為true,才返回true;比如: (8>5)&&(4<6),返回true;(8<5)&&(4<6),返回false。

** !**:邏輯非,若表達式的值為true,則返回false;若表達式的值為false,則返回true 比如:!(9>2),返回false;!(9<2),返回true,
? ? ?基本定義,我們都再熟悉不過了,看似好像沒有什么大用,其實這三個運算符在我們編寫代碼中所起到的重要作用。

** 首先看幾個例子**

var a = 0 || 1 || 2;  // a = 1 
var b = 1 || 0 || 3;  // b = 1 
var c = 0 || 0 || 0;  // c = 0 
var a = 0 && 1 && 2;  // a = 0 
var b = 1 && 0 && 3;  // b = 0 
var c = 0 && 0 && 0;  // c = 0
var d = 1 || 2 || 4;  // d = 1

? ? ?可見,邏輯運算符不是簡單的返回true/false,而是返回了某一個內容,其實它的判斷過程是這樣的:
** 邏輯運算符是從前往后依次判斷,判斷到那個能得出最終結論的地方,就會停止往下判斷并返回最后判斷的那個內容,不管它是真是假。**
比如:
||運算符:只要一個為真就為真,所以你可以認為它會從前往后一直按順序在找真,找到真就返回那個真。找不到也返回最后一個判斷的那個值。

 0 || 1 || 2,判斷到1就知道結果肯定是真,不再繼續判斷,返回1。 
 1 || 0 || 3, 判斷到第一個就知道結果是真,不再繼續判斷,返回1。
 0 || 0 || 0;一直判斷到了最后一個,才知道結果為假,返回最后一個判斷的0。

同理:&&運算符是只要一個為假就為假,所以它會從前往后一直找假的,返回最后一個判斷的值。

實際應用

** 1 給函數參數定義默認值**

var a = a||2; 
//判斷過程:如果變量a是真就停止判斷,返回a,如果a是假就繼續判斷,所以返回2. 實際上就是給a起了個默認值2。 
也等同于: 
if(a){ a = a  }else{ a =2 }
//因為js不像php可以直接在型參數上定義func($attr=5)一個默認值,所以可以通過這種方法給參數定義默認值。
//(順便提醒一下,最新的es6標準已經可以定義函數參數默認值了。)
//可以看出用邏輯運算符既節省代碼又實現功能

** 2 減少代碼量**
** 題目**:假設:如果a=5的時b=1,a=10的時b=2,a=12的時候b=3,其他情況b=0, 用代碼怎么實現?

** 最簡單的**

var b= 0;
if(a == 5){ 
  b = 1;
}else if(a == 10){ 
  b= 2;
}else if(a == 12){
   b= 3;
}else { 
   b = 0;
}

** 稍好些的switch:**

var b = 0; 
switch(a){ 
   case 5 :  b = 1; break;
   case 10 : b = 2; break; 
   case 12 : b = 3; break; 
   default : b = 0; break;
}

更好的

var b = (a==5 && 1) || (a==10 && 2) || (a==12 && 3) || 0;

進階

var b ={'5':1,'10':2,'12':3}[a] || 0;
等同于下面的代碼:
var obj = {'5':1,'10':2,'12':3};
var b = json[a] || 0;

如果需求改成
如果a>5的時b=1,a>10的時b=2,a>12的時候b=3,其他情況b=0, 用代碼怎么實現?

var b = (a>12 && 3) || (a>10 && 2) || (a>5 && 1) || 0;

是不是發現代碼一下子就少了很多,但需要注意的一點就是:
優點:js代碼精簡,能減少網絡流量,尤其是大量應用的js。
缺點:代碼可讀性的降低,
推薦:如果是相對復雜的應用,請適當地寫一些注釋。
我們可以不使用這些技巧,但是我們一定要能看懂,因為這些技巧已經廣泛應用,不理解這些你就很難看懂別人的代碼。

關于!運算符
很多代碼寫if(!!a),為什么不直接寫if(a);因為這樣寫更嚴謹
如下:

console.log(typeof 5); //number
console.log(typeof !!5); //boolean

可以看出:!可以把變量轉成的bool類型。不管!后面是什么類型,邏輯非都會將它轉成布爾類型

&& (邏輯與) 和||(邏輯或)的優先級
混合使用的時候要注意他們的優先級:&& (邏輯與) 優先級高于||(邏輯或)

**return a && b || c **

先算a&&b,a 是 false ,a&&b就是返回a,再算a||c,則肯定返回 c;如果a是true ,則要看B。

先講到這里,希望能幫助到一些人。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內容