1. 程式人生 > >你不得不知的邏輯或(||)與(&&)非(!)

你不得不知的邏輯或(||)與(&&)非(!)

       最近重新翻開原生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
OK.看完上面的栗子,你會發現邏輯運算子不是簡單的返回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 大大減少程式碼量

首先出個題:假設:成長速度為5顯示1個箭頭;成長速度為10顯示2個箭頭;成長速度為12顯示3個箭頭;其他都顯示都顯示0各箭頭。

  用程式碼怎麼實現?(例子來源於網上的一個貼吧裡)

  最簡單的

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

 稍好些的switch:

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

更好的

var add_level = (add_step==5 && 1) || (add_step==10 && 2) || (add_step==12 && 3)  || 0;

更更好的

var add_level={'5':1,'10':2,'12':3}[add_step] || 0;
等同於下面的程式碼:
var obj = {'5':1,'10':2,'12':3};
var add_level=json[add_step] || 0;

如果需求改成成長速度為>12顯示4個箭頭;成長速度為>10顯示3個箭頭;成長速度為>5顯示2個箭頭;成長速度為>0顯示1個箭頭;成長速度為<=0顯示0個箭頭。

var add_level = (add_step>12 && 4) || (add_step>10 && 3) || (add_step>5 && 2) || (add_step>0 && 1) || 0;
console.log(add_level);

哇塞,是不是發現我們的程式碼一下子就少了很多,但需要注意的一點就是:一方面精簡js程式碼,能實質性的減少網路流量,尤其是大量應用的js公用庫。同時,也帶來了程式碼可讀性的降低,個人比較推薦的做法是:如果是相對複雜的應用,請適當地寫一些註釋。

我們可以不使用這些技巧,但是我們一定要能看懂,因為這些技巧已經廣泛應用,不理解這些你就很難看懂別人的程式碼。

關於!運算子

很多程式碼寫if(!!attr),為什麼不直接寫if(attr);其實這是一種更嚴謹的寫法,如下:

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,自己想想吧。。。

另附:JS運算子優先順序(從高到低列出)

 運算子 描述
. [] () 欄位訪問、陣列下標、函式呼叫以及表示式分組
++ -- - ~ ! delete new typeof void 一元運算子、返回資料型別、物件建立、未定義值
* / % 乘法、除法、取模
+ - + 加法、減法、字串連線
<< >> >>> 移位
< <= > >= instanceof 小於、小於等於、大於、大於等於、instanceof
== != === !== 等於、不等於、嚴格相等、非嚴格相等
& 按位與
^ 按位異或
| 按位或
&& 邏輯與
|| 邏輯或
?: 條件
= oP= 賦值、運算賦值
, 多重求值

如有錯誤,歡迎指正。

相關推薦

不得不知邏輯(||)(&&)(!)

       最近重新翻開原生JS,又得到很多不同的體會,雖然現在開發框架那麼多,但很多思想都還是離不開原生的基礎。今天呢,我就根據自己的學習總結一下邏輯與(&&)和(邏輯或(||)和邏輯非(!)。       基本定義       ||:邏輯或,只有表示式的值都為false,才返回false

細數不得不知的容器安全工具

docker 工具 網絡安全 鏡像 引擎 容器 網絡安全問題的重要性大概毋庸置疑,最近無數關於惡意軟件和安全漏洞的消息已充分證明了這一點。假如你要管理一個Docker環境,並希望幫助自己的公司或用戶在下一個大漏洞來臨時避免遇到麻煩,那麽你就需要了解一些保障Docker應用安全的工具,並

做用戶體驗設計,不得不知的18件事

以下內容由Mockplus團隊翻譯整理,僅供學習交流,Mockplus是更快更簡單的原型設計工具。 沒有人會告訴你的設計小竅門 我在40歲的時後改變了我的職業生涯,成為了一名UX設計師。2014年,我在澳大利亞悉尼完成了一個為期3個月的UX設計課程。課程完成後,我仍然有很多東西要

TCP/IP中不得不知的十大秘密

比特 smt 鏈路 復數 增長 超過 工具 地址解析 gmp 這段時間 有一點心很浮躁,不過希望自己馬上要矯正過來。好好學習編程!這段時間我想好好地研究一下TCP/IP協議和網絡傳輸這塊!加油 一、TCP/IP模型 TCP/IP協議模型(Transmission Con

OCR----不得不知的Tesseract六大重要核心

Abstract 整理了很多OCR的資料,這篇主要是對Tesseract重要的知識進行總結羅列。本次總結,基於2007年Smith所寫的Paper—-《An Overview of the Tesseract OCR Engine》,所以算是論文導讀吧。PS:Smith是一個專

C語言之不得不知的指標(二)

 C語言之你不得不知的指標(二)         指標是一個地址,指標變數是存放地址的變數。通過下面這幾段程式可以很好的理解指標和指標變數。              

C語言之不得不知的陣列(一)

1、強制型別轉換運算子:     (double)a --------------------(將a轉換為double型別)     (int)(x+y)-------------------(將x+y的值轉換為int型別)   &n

Kubernetes 1.5有哪些不得不知的新功能?_Kubernetes中文社群

今年9月份我們迎來了Kubernetes 1.4的驚喜釋出,一大波新功能讓人眼花繚亂。經過將近三個月時間的打磨,如今Kubernetes再推出新版本,翹首以盼的Kubernetes 1.5重磅釋出,本次版本更新涵蓋了4個主題、12個新特性以及4個原有基礎上的重大變更。期待不如眼疾手快,翻閱文章

每個專案中,不得不知的11個Java第三方類庫

單元測試 DBunit是一個基於junit擴充套件的資料庫測試框架。它提供了大量的類對與資料庫相關的操作進行了抽象和封裝。 Mockito是一個針對Java的mocking框架。你可以使用簡潔的API編寫出漂亮的測試。 Hamcrest 是一個測試輔助工

如果喜歡Python 那麼不得不知的幾個開源專案

1.Trac Trac擁有強大的bug管理 功能,並集成了Wiki 用於文件管理。它還支援程式碼管理工具Subversion ,這樣可以在 bug管理和Wiki中方便地參考程式原始碼。 Trac有著比較強大的外掛系統,可以通過外掛來實現各種各樣的功能,比如支援G

揭祕“風水界”不得不知的那些事

  風水師大家都不“麥勝”吧!古往今來都有相關記載,看個風水、選個陰宅那是“小菜一碟”。不管是哪路“神仙”都自稱是可以逢凶化吉的“風水大師”,其實不然。 風水師在宋代比較盛行,到明清就變得氾濫,看似在我國解放理論時期的影響下受到了“重創”,但實際中還在不斷運用,到目前為止,

有趣!10個不得不知的Linux終端遊戲

關注「實驗樓」,每天分享一個專案教程   Linux 終端在多數人眼中,是一個非常單調和無聊的工

12種不得不知的Android除錯方式

1. 檢視當前堆疊1) 功能:在程式中加入程式碼,使可以在logcat中看到打印出的當前函式呼叫關係2) 方法: new Exception(“print trace”).printStackTrace();2. MethodTracing1) 功能:用於熱點分析和效能優化,分析每個函式佔用的CPU時間,呼叫

邏輯“||”按位“|”的區分

ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE,FALSE,Pr

JVM 中不得不知的一些引數

有的同學雖然寫了一段時間 Java 了,但是對於 JVM 卻不太關注。有的同學說,引數都是團隊規定好的,部署的時候也不用我動手,關注它有什麼用,而且,JVM 這東西,聽上去就感覺很神祕很高深的樣子,還是算了吧。 沒錯,部署的時候可能用不到你親自動手,但是出現問題了怎麼辦,難道不用你解決問題嗎,如果對 JVM

前端開發:這10個Chrome擴充套件不得不知

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。 原文出處:https://blog.bitsrc.io/10-top-chrome-extensions-for-front-end-developers-db23a01dce1e 1. CSSViewer &nb

電腦科學之演算法——不得不知的遞迴

# 遞迴 >本系列文章在Github:[StevenEco](https://github.com/StevenEco/ComputerScience)以及[WarrenRyan](https://www.cnblogs.com/warrenryan)同步更新 ## 簡介 程式呼叫自身的程式設計技巧稱為

升級Kubernetes 1.18前,不得不知的9件事

本文來自Rancher Labs 昨天Kubernetes最新版本v1.18已經發布,其包含了38項功能增強,其中15項為穩定版功能、11項beta版功能以及12項alpha版功能。在本文中,我們將探索其中一些功能,希望能幫助你決定是否需要升級。那麼,我們現在開始吧! 將Service Account T

Java 位運算(移位、位、異邏輯運算

高效率 邏輯與 才會 system 區別 span get 右移 邏輯 java 位運算包括:左移( << )、右移( >> ) 、無符號右移( >>> ) 、位與( & ) 、位或( | )、位非( ~ )、位異或( ^

2.4 邏輯運算子 &&()、||()、(!)

一、邏輯運算子 &&(與)、||(或)、非(!)   邏輯運算子兩邊的表示式一定是布林值,結果也是布林值。 1.1.1 邏輯與 && => 表示並且、且的意思:   true && true = true