[翻譯]JavaScript中的與(AND)、或(OR)邏輯運算子到底是如何工作的
昨晚,我看了Douglas Crockford講解的題為“JavaScript程式語言”的視訊,並從中學到一些有關JavaScript中與(AND)、或(OR)邏輯運算子的有趣內容。我想,應該把它分享給大家。
首先,先讓我們一起看一下邏輯與(AND)運算子。
1 if(expr1 && expr2){ //do something }
按照我以前對此運算子(operator)的理解,如果運算元(operand)“expr1”和“expr2”同時為真時,那麼上面的程式碼片段將會執行任何位於if語句塊中的內容。這是絕對正確的,並且恰好也是如此工作。唯一的蹊蹺是,究竟幕後實際發生了什麼。根據Mozilla的JavaScript文件對邏輯運算子(logical operators)的說明。
(邏輯與)若expr1可轉換為false[譯註1],則返回expr1;否則,返回expr2。因此,當使用布林值時,若兩個運算元都是true,則&&運算子返回true;否則,返回false。
因此換言之,這意味著,若expr1為真,則expr1 && expr2將返回expr2,否則將返回expr1。
注意:當邏輯與(&&)運算子與非布林值(non Boolean Values)一起使用時,其運算結果不會返回“true”或“false”,而是返回兩個表示式中的某一表示式本身。
好酷,讓我們根據這一資訊對if語句塊一探究竟。因此,若expr1為真,則expr1 && expr2返回expr2。此刻,只有當expr2為真時,該if語句塊才會執行。
因此,為了if語句塊能得以執行,最終兩個表示式都需為真,這正如我們一開始所討論的那樣。
讓我們來看下如何利用這個特性來重構一種常見場景,即,我們希望只有當某物件存在時,才呼叫該物件的某個方法。
初始程式碼:
1 if(a){
2 return a.method();
3 }else{
4 return a;
5 }
重構的程式碼:
1 return a && a.method();
重構的程式碼做了一模一樣的事情,但是比初始程式碼表現力更豐富且速度更快。
現在,讓我們看下邏輯或(OR)
根據定義:
(邏輯或)若expr1可轉換為true,則返回expr1;否則,返回expr2。因此,當使用布林值時,若任一運算元是true,則||運算子返回true;若兩個運算元都是false,返回false。
或換言之,若expr1為真,則expr1 || expr2將返回expr1,否則返回expr2。
再次注意:當邏輯或(||)運算子與非布林值(non Boolean Values)一起使用時,其運算結果不會返回“true”或“false”,而是返回兩個表示式中的某一表示式本身。
這個特性可用於以表示式風格來定義變數的預設值。
1 var myVar = input || default;
此處,若input為真,則myVar將被賦為input,否則被賦為default。
好了,就到此為止吧。如果您有任何問題或建議,那麼請儘管在twitter上聯絡我或者在下面發表評論,而且我會盡我所能幫您解答!
譯註
[1] 可轉換為false,可轉換為false是指計算結果為null、0、空字串("")、或者undefined的那些表示式。反之,除了前面提到的那些特殊值以外,其他計算結果均可轉換為true。有關邏輯運算子(Logical Operators)的更多內容,請參見Mozilla的線上說明文件。
檢視英文原文:How Logical AND and OR Operators Actually Work in Javascript.
本文參與iTran樂譯專案。
相關文章
- JavaScript || 邏輯或運算子JavaScript
- JavaScript && 邏輯與運算子JavaScript
- JavaScript ! 邏輯非運算子JavaScript
- JS 中的邏輯運算子JS
- 邏輯運算子
- # JavaScript中的 || 與 && 運算子JavaScript
- 8.Golang中的運算子-算術運算子、關係運算子、邏輯運算子、賦值運算子Golang賦值
- SCSS 邏輯運算子CSS
- 4、邏輯運算子
- JS 邏輯運算子的特點JS
- MySQL的四種運算子(算術運算子、比較運算子、邏輯運算子和位運算子)MySql
- iOS Swift邏輯運算子iOSSwift
- 【Python基礎知識】Python中的邏輯運算子Python
- php運算子 比較運算子 邏輯運算子 三元運算子PHP
- javascript中&&運算子和||運算子的使用JavaScript
- Java基礎09:邏輯運算子、位運算子Java
- [Web翻譯]JavaScript中的編譯與填充WebJavaScript編譯
- 關於 isset 和邏輯運算子的使用
- Python學習-比較運算子和邏輯運算子Python
- JavaScript | 按位或運算子JavaScript
- 一分鐘搞懂邏輯運算子&(並且) , |(或者) , !(非) , ^(異或) , &&(短路與) , ||(短路或)之間的關係
- python-邏輯運算子對應的函式Python函式
- 【C】 15_邏輯運算子分析
- 【C進階】15、邏輯運算子
- Kotlin 運算子詳解:算術、賦值、比較與邏輯運算子全解析Kotlin賦值
- JavaScript ^ 按位異或運算子JavaScript
- java短路邏輯運算子是什麼Java
- 物聯網學習教程——邏輯運算子和邏輯表示式
- tyFlow Script運算子API中文翻譯文件API
- JavaScript & 按位與運算子JavaScript
- day01-字串方法-邏輯運算子規律字串
- 逍遙自在學C語言 | 邏輯運算子C語言
- [翻譯]JavaScript的成本JavaScript
- js中的|與 && 運算子詳解JS
- JavaScript in 運算子JavaScript
- JavaScript運算子JavaScript
- JavaScript -= 運算子JavaScript
- JavaScript += 運算子JavaScript
- JavaScript *= 運算子JavaScript