javascript - 为什么函数有时返回0有时返回false?

标签 javascript node.js

<分区>

我编写了以下 Javascript 函数,当恰好有一个参数为真时返回 true:

function onlyOne( a, b, c) {
    return (a && !b && !c) ||
        (b && !a && !c) ||
        (c && !a && !b);
}

它按预期工作,除了在一些情况下返回 0:

EXPECT true:
true = onlyOne( 1, 0, 0)
true = onlyOne( 0, 1, 0)
true = onlyOne( 0, 0, 1)

EXPECT false:
0 = onlyOne( 0, 0, 0)
false = onlyOne( 0, 1, 1)
false = onlyOne( 1, 0, 1)
0 = onlyOne( 1, 1, 0)
false = onlyOne( 1, 1, 1)

为什么在上述两种情况下它返回 0 而不是 false?我看到这是仅有的两种 c 为 0 的负面情况,但我看不出这有何不同。显然,我在这里不了解有关 Javascript 逻辑运算符和/或类型转换的某些内容。

这是生成上述输出的完整代码。我正在使用 node.js 4.3.0 从 Windows 命令行运行它,如果有任何不同的话:

    function testOnlyOne( a, b, c) {
        result = onlyOne(a, b, c);
        console.log("%j = onlyOne( %j, %j, %j)", result, a, b, c);
    }
    
    function onlyOne( a, b, c) {
        return (a && !b && !c) ||
            (b && !a && !c) ||
            (c && !a && !b);
    }
    
    console.log("\nEXPECT true:");
    testOnlyOne( 1, 0, 0);
    testOnlyOne( 0, 1, 0);
    testOnlyOne( 0, 0, 1);
    
    console.log("\nEXPECT false:");
    testOnlyOne( 0, 0, 0);
    testOnlyOne( 0, 1, 1);
    testOnlyOne( 1, 0, 1);
    testOnlyOne( 1, 1, 0);
    testOnlyOne( 1, 1, 1);

最佳答案

因为如果 JavaScript 检查假值和真值的方式。 false0'' undefinednull 等值。 .., 被认为是假的(Boolean() 的返回值对于任何这些返回 false),而其他如 true, 1'hi'[] 是真实的(Boolean() 的返回值对于任何这些返回 ).

因此,当执行诸如0 && 'a' 之类的指令时,将始终返回0,因为0 是假的,而 && 运算符在任何值为 false 后都不会前进,因为要使 && 返回 true,它所应用的所有值都必须为真。另一方面,执行诸如 true && 'hello' && null 之类的指令将始终返回 null,因为所有第一个值都是 null是真实的,所以实际语句解析为 null

关于javascript - 为什么函数有时返回0有时返回false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51449949/

相关文章:

javascript - 是否可以更改标准 JavaScript 对象的类型

javascript - 在 where 子句上对 Access 父表的字段进行 Sequelize

javascript - 从 AJAX 请求中检索值的函数

javascript - 如何将 sipML5 js 与 Mobicent SIP servlet 一起使用?

javascript - 在数字序列中找到第一个缺失的数字

javascript - 为分析和跟踪设置 Android 应用程序

javascript - Node.js 为什么一次只打印一个

node.js - Nodejs表达如何将响应发送回浏览器

javascript - Node.js 从事件中取消 setTimeout

node.js - 如何在 mongodb 中推送一个新文档,但前提是它不存在?