2014-04-24 49 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语句笨重。

相关问题