你不得不知的邏輯或(||)與(&&)非(!)
最近重新翻開原生JS,又得到很多不同的體會,雖然現在開發框架那麼多,但很多思想都還是離不開原生的基礎。今天呢,我就根據自己的學習總結一下邏輯與(&&)和(邏輯或(||)和邏輯非(!)。
基本定義
||:邏輯或,只有表示式的值都為false,才返回false,其他情況返回true 比如:(8>5)&&(4<6),返回true;(8<5)&&(4<6),返回false
&&:邏輯與,若兩邊表示式的值都為true,才返回true;比如: (8>5)&&(4<6),返回true
!:邏輯非,若表示式的值為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