2

我刚刚回答了这个问题,但我不明白为什么它会这样工作。

基本上问题可以简化为:

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

4 回答 4

2

==做了很多强制:

Object == false =>
Object == 0 =>
Object.valueOf() == 0 =>
false == 0 =>
0 == 0 =>
true

或者如果你按照算法中的步骤,它是

Step 7, Step 9, Step 6, Step 1 c iii.

逻辑 and just 直接 forToBoolean,它总是返回true对象

请注意,它new Boolean返回一个对象而不是布尔值。

于 2013-07-11T10:29:16.840 回答
0

也许对象 b 在做 (b && 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。

于 2013-07-11T10:38:12.307 回答
0

我不确定我是否正确理解了您的问题,但看起来主要问题源于if (new Boolean(false))评估为真的事实。如果将表达式放在if语句中或将它们与逻辑运算符(即&&)链接起来,JavaScript 只会检查它们是还是。当谈到布尔基元时,很容易:

true -> truthy
false -> falsy

但是当涉及到布尔对象时,它看起来不同:

new Boolean(false) -> truthy
new Boolean(true) -> truthy

这样做的原因是,在 JavaScript 中,每个对象(如果不是 null)都是真实的。

于 2013-07-11T10:38:18.147 回答
0

假和假是假的。真值表 - AND 只有在两个参数都为真时才返回真,在这种情况下也不是.

编辑: True AND False 也是错误的,所以任何 && False 都是错误的。

于 2013-07-11T10:27:01.103 回答