2013-05-14 94 views
2

看到的结果,在谷歌Chrome浏览器打开控制台,请执行下列操作:为什么在JavaScript中:obj = new Boolean(false),(obj && true)是true,(obj || false)是false?

obj = new Boolean(false) 
"obj && true: " + (obj && true) 
"obj || true: " + (obj || false) 

和:

(obj && true) == true // this is true 
(obj || false) == true // this is false 

为什么

(obj || false) 

的回报,而不是一个Boolean对象,布尔值?

(嗯..我也把内容摘要如下答案)

+0

我敢打赌,在最后一行的 “假” 是指'obj'。试试'obj || 0' – 2013-05-14 08:11:47

+0

我看到呈现给我的错误对象为布尔{}' – 2013-05-14 08:14:00

+1

我没有得到你所报告的内容。特别是'(obj || false)'返回'Boolean {}'。它测试为一个真值:'!!(obj || false)'是'true'。请注意,'false'与'false'并不相同! – 2013-05-14 08:16:58

回答

3

有需要加以这里考虑两个概念:

obj = new Boolean(false) 

创建一个对象,其值是false。对象本身被认为是真实的,它的价值(你得到的toString()valueOf())当然是布尔值false

(x||y) 

返回第truthy值(或者,如果不存在,最后falsy值)和

(x&&y) 

返回第falsy值(或者,如果不存在,最后truthy值)。

所以(obj||false)回报您Boolean对象(obj&&true)返回第二个(true)值。

更进一步的前景取决于你的表达的上下文。

"obj && true: " + (obj && true) 

需要一个字符串上下文,所以toString()叫你的Boolean对象,返回它的值,它是false(虽然对象本身是truthy!)。

此外,

(obj && true) == true比较true == true这当然是正确的。然而,

(obj || true) == true做了很多类型强制§11.9.3的并且比较

ToPrimitive(obj) == ToNumber(true)§9.1§9.3),这导致NaN == 1其产生错误的。

如果您使用严格的相等性运算符§11.9.6,结果会更具可预测性。

0

你的对象(obj)是一个包裹布尔和JavaScript对待它的方式。

(new Boolan(false)|| false)的确是假的。

1

在第一个示例中,您的obj评估为truthy,因此评估为truthy && true == true

在第二个示例中,评估对象时又被认为是真实的,因此在评估obj后,懒惰评估停止。然后返回obj,它本身的值为false

0

我的Chrome浏览器为前声明 返回true,并返回后者声明

2

对于第一种情况的Boolean对象,该obj是truthy值,从而真正& &真正返回true。

对于第二种情况,它返回obj,它是Boolean{}。如果您将其转换为字符串(发生这种情况,如果您的输入是"string" + (obj || false)),那么它将返回,这是“false”。

再次,这是因为objfalse但对象本身就是一个truthy价值!

+0

问题更新 – 2013-05-14 08:18:57

+1

答案更新:) – 2013-05-14 08:22:26

+0

Thx的答复。为什么(obj || false)返回一个布尔对象而不是布尔值? – songyy 2013-05-14 08:24:28

0

得到以下问题的答案后,让我做一个总结这里(在计算器上的人是真正有用的〜谢谢大家〜):

的& &和短切行为||运算符,以及对象的真实值,这是我猜测问题的根源。

(下面是我从几个行为我试图总结)

我会用:

o = new Object; 
t = new Boolean(true); 
f = new Boolean(false); 

当||被使用,它会采取第一个非错误值。因为:

(f || t) == true; // false 
(t || f) == true; // true 
(false || f) == true; // false 
typeof (false || f); // "object" 
typeof (true || f); // "boolean" 

当使用& &,它会采取的第一个非真正的价值。由于对象本质上是真实的,所以它会尝试返回最后发生的对象,或者如果存在,则返回第一个假。

下面是一个例子:

(o || t) // it returns the 'o' since it's the first true 
(o && t) // it returns t since it's the last true 
(true && t) // it returns t also, same reason 
(false && t) // it returns false since it's the first occurring false. 
相关问题