为什么这个布尔铸件没有按预期工作?

时间:2013-07-11 10:24:27

标签: javascript casting boolean

我刚回答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   // ???

4 个答案:

答案 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 ToBooleanalways returns true for objects

请注意new Boolean returns an object and not a boolean value.

答案 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)都是真的。