我刚回答this question,但我不明白为什么它的工作方式如此。
基本上问题可以简化为:
var b = new Boolean(false);
console.info(b == false); // Prints "true" - OK
console.info(b && true); // Prints "true" - but should be "false"
我认为有一些不直观的自动投射正在进行,但我不明白它有时会自动投放到true
,有时会投放到false
。有什么想法吗?
我想这可以更好地说明问题:
> false && 123
false // OK
> new Boolean(false) && 123
123 // ???
答案 0 :(得分:2)
==
做了很多强制行动:
Object == false =>
Object == 0 =>
Object.valueOf() == 0 =>
false == 0 =>
0 == 0 =>
true
或者,如果您按照steps in the algorithm进行操作,则
Step 7, Step 9, Step 6, Step 1 c iii.
logical and just goes directly for ToBoolean
,always returns true
for objects。
答案 1 :(得分:0)
假和假是错误的。真值表 - 如果两个参数都为真,则只返回true,且在这种情况下都不是。
编辑:真假也是假的,所以任何事情和&&假是假的。
答案 2 :(得分:0)
在做(b&& false)时,对象b可能是真的,但对true和false结果的逻辑运算做错。
如果你这样做:
var b = new Boolean(false);
console.info(b == false); // Prints "true" - OK
console.info(b && true); // Prints "true"
因此,即使对象b在(b&& true)中设置为false,也会导致为true,因为它存在并且未设置为null。
答案 3 :(得分:0)
我不确定我是否正确理解了您的问题,但看起来主要问题来自if (new Boolean(false))
评估为真的事实。如果您将表达式放在if
语句中或将它们与逻辑运算符(即&&
)链接,JavaScript只会检查它们是真实还是虚假 。说到布尔基元,很容易:
true -> truthy
false -> falsy
但是当谈到布尔对象时,它看起来不同:
new Boolean(false) -> truthy
new Boolean(true) -> truthy
原因是,在JavaScript中,每个对象(如果不是null)都是真的。