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

Rea*_*lar 4 javascript operators

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

var x = "abc";
var y = 3;
var z = "xyz";
var a = x && y || z;
Run Code Online (Sandbox Code Playgroud)

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

我原以为这会导致a == true.

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

此外,如果你改变y = 0那么a == "xyz"意味着&&0视为false.将数字视为数字会怎样?

逻辑运算符在这里发生了什么?

amo*_*mon 15

这是可以预料的.

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

如有必要,值[...]将转换为布尔值.如果值是[...]为0,-0,null,false,NaN,undefined,或空字符串(""),[它]假的.所有其他值,包括任何对象或字符串"false",都会创建[...] true.

逻辑运算符||并且&&不返回,true或者false它们返回最后一个参数来影响它们是真实还是虚假(引用):

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


Ars*_*nko 10

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

    • false && 3会回来的false,
    • true && 3会回来的3.

    "abc"不是假的,因此JavaScript采用第二部分,即3.

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

  • 只是添加一点,_gotcha_这里是逻辑AND和OR运算符不返回布尔值,它们返回它们实际评估的最后一个操作数的值.`false || 例如,null`将等于"null". (9认同)