[翻譯]JavaScript中的與(AND)、或(OR)邏輯運算子到底是如何工作的

高翌翔發表於2011-11-24

昨晚,我看了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樂譯專案。

相關文章