为什么null不会在条件语句中转换为布尔值?

时间:2015-11-09 11:53:54

标签: javascript boolean comparison

具有以下测试用例:(找小提琴here

var a = new Date();
var b = null;
var c = {test: "test"};

if(a)
    console.log(a); //--- prints the current date

if(b)
    console.log('null'); //--- never reached

if(c)
    console.log('test'); //--- prints 'test'

console.log(a && b); //--- prints null

知道

console.log(typeof null); //--- prints "object"
console.log(typeof c); //--- prints "object"

我期待

的结果
console.log(a && b); 

false ,而不是 null ,如示例中所示。

任何提示?

3 个答案:

答案 0 :(得分:4)

来自the MDN

  

expr1 && expr2:如果可以转换为false,则返回expr1; 否则,返回expr2

new Date无法转换为false(它不是falsy),因此会返回b

答案 1 :(得分:1)

  

我期待

的结果
console.log(a && b);
     

是示例中显示的false而不是null

在使用&&||运算符(或ANDOR)的多种语言中,结果始终为布尔值,是。*但是JavaScript {{1} }和&&比这更有用:它们的结果是左手操作数的值或右手操作数的值,强制转换为布尔值。

以下是||的工作原理:

  1. 评估左手操作数。

  2. 如果值为 falsey (当我们将其设为布尔值时强制转换为&&),则返回值(不是强制值)

  3. 如果#2中的值为 truthy ,请评估并返回右侧值(未强制)

  4. falsey 值为falsenullundefined0"",当然还有{{ 1}}。其他一切都是 truthy

    例如

    NaN

    ...显示false,因为console.log(0 && 'hi'); // 0 是假的。请注意,结果是0,而不是0。同样,结果如下:

    0

    ...是false,因为console.log(1 && 'hello'); // hello 根本没有强制执行右侧。

    'hello'的工作方式类似(我称之为curiously-powerful OR operator):它评估左侧,如果是 truthy ,则将其作为结果;否则它会评估右侧并将 作为结果。

    唯一一次从&&||获取truefalse,如果所选操作数布尔值。

    *当然,许多(但不是全部)这些语言(Java,C#)也要求&&||的操作数已经是布尔值。 C是一个例外,它做了一些强制,但仍然将操作数的结果作为布尔值(或者如果你回到足够远的地方,一个int将是1或0)。

答案 2 :(得分:0)

来自MDN:

  

逻辑AND(&& amp;)expr1&& expr2如果可以转换,则返回expr1   为假;否则,返回expr2。因此,当与布尔一起使用时   价值观,&&如果两个操作数都为真,则返回true;否则,返回   假的。

MDN Documentation