为什么这段代码在JavaScript中产生3?

时间:2014-04-24 12:38:38

标签: javascript operators

为什么以下代码会产生a == 3

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

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

我原本希望这会产生a == true

为什么逻辑运算符会将"abc"评估为true,但不会将3评估为true。相反,它会产生3作为结果。

此外,如果您更改y = 0,则更改a == "xyz",这意味着&&0视为false。将数字视为数字会怎样?

这里有什么与逻辑运算符进行的对比?

3 个答案:

答案 0 :(得分:15)

这是可以预期的。

在JavaScript(以及许多其他语言)中,不仅布尔本身本身也是假的,但其他对象也可能是真实的或假的(参见the docs on mdn):

  

如果需要,将值[...]转换为布尔值。如果值为[...] 0-0nullfalseNaNundefined或空字符串({{ 1}}),[它]是假的。所有其他值,包括任何对象或字符串"",都会创建[...] true。

逻辑运算符"false"||不会返回&&true,而是返回最后一个参数来影响它们是真实还是虚假( reference):

  
      
  • false - 如果可以转换为false,则返回expr1 && expr2;否则,返回expr1。因此,当与布尔值一起使用时,如果两个操作数都为真,则expr2返回true;否则,返回false。
  •   
  • && - 如果可以转换为true,则返回expr1 || expr2;否则,返回expr1。因此,当与布尔值一起使用时,如果任一操作数为真,则expr2返回true;如果两者都为假,则返回false。
  •   

答案 1 :(得分:10)

  1. 第一步是评估"abc" && 3

    • false && 3会返回false
    • true && 3会返回3

    “abc”不是假的,因此JavaScript采用第二部分,即3。

  2. 第二步是评估3 || "xyz"。这里,JavaScript采用非空的第一个值,即3.这类似于C#中的this.firstObject ?? this.defaultValue:第二部分仅在第一部分为空时才采用。

答案 2 :(得分:1)

副作用是你可以这样做:

x = x || {};

如果未设置变量,则将变量设置为默认值。

或者

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

以避免笨重的if语句。