2013-07-11 150 views
2

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

你怎么说'b &&假'shold是真的 –

+0

有趣的问题!增加了一个清晰的例子。 – georg

回答

0

也许这样做(B & &假),但在做的结果true和false逻辑运算为false时,对象B是真实的。

如果你这样做:

var b = new Boolean(false); 
console.info(b == false); // Prints "true" - OK 
console.info(b && true); // Prints "true" 

因此,即使对象B被设置为False(B & &真)它的结果为真,因为它的存在,它不是设置为null。

0

假和假是假的。真值表 - 如果两个参数都为真,则只返回true,,在这种情况下都不是

编辑:真和假也是假的,所以任何东西& &假是错误的。

+0

但他正在做'真和假'。 – Esailija

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

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

+0

换句话说,布尔(新的布尔(假))'是真实的。 Javascript的元素! – georg

+0

无论如何,这些包装器对象完全没用,现在'this'可以是ES 5.1中的一个原语 – Esailija

0

我不确定我是否正确理解您的问题,但看起来主要问题来自if (new Boolean(false))评估为真的事实。如果你把表情在if语句或逻辑运算符将它们链接(即&&),JavaScript的只是检查,如果他们是truthyfalsy。当谈到布尔元,很容易:

true -> truthy 
false -> falsy 

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

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

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

相关问题