我写了下面的JavaScript函数,目的是在只有一个参数为真值时返回
为什么在上述两种情况下它返回0而不是false? 我看到这些是唯一的两种负面情况,其中c为0,但我不知道这有什么区别。显然,在此处我没有理解JavaScript逻辑运算符和/或类型转换方面的某些内容。
以下是生成上述输出的完整代码。如果有所不同,我正在使用node.js 4.3.0从Windows命令行运行此代码:
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);
&&
和||
运算符不一定返回布尔值。 - Pointy&&
,因此它返回0。 如果第一个参数是1作为||,则不需要进行以下检查。 这就是所谓的短路逻辑。 - Taplar!!
),例如return !!((a && !b && !c) || (b && !a && !c) || (c && !a && !b))
,这将始终产生一个布尔类型的结果。 - Will