【问题标题】:why null is not converted to a boolean value in a conditional statement?为什么在条件语句中 null 不转换为布尔值?
【发布时间】:2015-11-09 11:53:53
【问题描述】:

有以下测试用例:(find fiddle 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 如示例中所示。

有什么提示吗?

【问题讨论】:

    标签: javascript boolean comparison


    【解决方案1】:

    来自the MDN

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

    new Date 无法转换为false(不是falsy),所以返回b

    【讨论】:

    • 我如何知道什么可以转换为false,什么不能?是否有任何表格显示可以转换为 false 的类型?
    • @BeNdErR:在条件下强制为假的值称为“假值”。这是列表:nullundefined0""NaN,当然还有false。其他一切都是真实。所以所有null对象引用都是真实的。
    • @BeNdErR 再次查看 MDN 关于“truthy”:developer.mozilla.org/en-US/docs/Glossary/Truthy
    • stackoverflow 上还有另一个答案提供了完整的虚假列表:stackoverflow.com/questions/19839952/…
    • @BeNdErR 通过否定表达式将表达式转换为真/假,然后使用像 console.log(!(!a || !b));console.log(!!a && !!b) 这样的德摩根定律应该可以工作
    【解决方案2】:

    我期待结果

    console.log(a && b);
    

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

    在许多带有&&|| 运算符(或ANDOR)的语言中,结果总是一个布尔值,是的。* 但是JavaScript 的&&|| 比这更有用: 他们的结果是左手操作数的值或右手操作数的值,强制为布尔值。

    && 的工作原理如下:

    1. 计算左边的操作数。

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

    3. 如果来自 #2 的值是 truthy,则评估并返回右侧值(非强制)

    falsey 值为nullundefined0""NaN,当然还有false。其他的都是真实

    例如

    console.log(0 && 'hi');    // 0
    

    ...显示0 因为0 是假的。请注意,它导致0,而不是false。同样,这里的结果:

    console.log(1 && 'hello'); // hello
    

    ...是'hello',因为右侧完全没有被&&强制。

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

    您从&&|| 获得truefalse 的唯一情况是所选操作数已经为布尔值。


    * 当然,许多(但不是全部)这些语言(Java、C#)还要求&&|| 的操作数已经是布尔值。 C 是一个例外,它会进行一些强制转换,但仍然将操作数的结果作为布尔值(或者如果你回溯得足够远,一个 int 将是 1 或 0)。

    【讨论】:

    • 要么你的写作令人困惑,要么我比我想象的更累。 new Date() && null 评估为 false 的“多种语言”是什么?我误会你了吗?
    • @DenysSéguret:在许多语言中,&&|| 总是产生布尔值。当然,在大多数这些语言中,&&|| 的操作数必须是布尔值,不进行强制转换(C#、Java 等)。 C 是一个完成强制转换的示例(类似于 JavaScript,尽管规则不同),但结果是布尔值(与 JavaScript 不同)。为了更清楚,我将重新措辞。
    【解决方案3】:

    来自 MDN:

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

    MDN Documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 2014-03-16
      相关资源
      最近更新 更多