2014-04-24 48 views
4

爲什麼下面的代碼產生a == 3爲什麼這段代碼在JavaScript中產生3?

var x = "abc"; 
var y = 3; 
var z = "xyz"; 
var a = x && y || z; 

http://jsfiddle.net/thinkingmedia/qBZAL/

我本來期望這導致a == true

爲什麼邏輯運算符評估爲​​爲true,但不評估3true。結果產生了3

此外,如果你改變y = 0然後a == "xyz"這意味着&&處理0false。將數字視爲數字會發生什麼?

這裏的邏輯運算符是怎麼回事?

+0

任何人對此問題有更好的標題? – cgTag

+3

你爲什麼不在堆棧溢出問? http://meta.stackexchange.com/a/129632/165773 – gnat

+0

@gnat好像是一個普通的編程問題。 – cgTag

回答

15

這是可以預料的。

在JavaScript(和許多其他語言),不僅布爾值本身是真的還是假的,但其他的對象可以是truthy或falsey以及(見the docs on mdn):

值[...]轉換如果需要,可以設置爲布爾值。如果值爲[0,-0,null,false,NaN, undefined或空字符串(""),則[它]爲false。所有其他值,包括任何對象或字符串"false",均創建爲true。

邏輯運算符||&&不返回truefalse,而它們返回的最後一個參數來影響他們是否truthy或falsey(reference):

  • expr1 && expr2 - 返回expr1如果可以轉換爲假的;否則,返回expr2。因此,當與布爾值一起使用時,如果兩個操作數都爲真,則&&返回true;否則,返回false。
  • expr1 || expr2 - 退貨expr1如果它可以轉換爲true;否則,返回expr2。因此,如果使用布爾值,則||如果任一操作數爲true,則返回true;如果兩者都是假的,則返回false。
+1

+1。警惕麻煩是很重要的。 –

10
  1. 第一步是評估"abc" && 3

    • false && 3將返回false
    • true && 3將返回3

    「ABC」 是不是虛假的,所以需要的JavaScript的第二部分,即3.

第二步是評價3 || "xyz"。這裏,JavaScript取第一個非空的值,即3.這與C#中的this.firstObject ?? this.defaultValue類似:第二部分僅在第一部分爲空時才被採用。

+9

只需添加一點點,這裏的_gotcha_是邏輯AND和OR運算符不返回布爾值,它們返回它們實際評估的最後一個操作數的值。 'false ||例如,null將等於'null'。 – Mike

1

的副作用是,你可以做這樣的事情:

x = x || {}; 

一個變量設置爲默認,如果沒有設置它。

或者

TrackingManager && TrackingManager.track("user was here") 

避免if語句笨重。

相關問題