为什么在JavaScript中:obj = new Boolean(false),(obj&& true)为true,(obj || false)为false?

时间:2013-05-14 08:09:18

标签: javascript

要查看结果,请在Google Chrome中打开控制台,执行以下操作:

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)

返回布尔对象,而不是布尔值?

(嗯..我还在下面写了一个总结答案)

6 个答案:

答案 0 :(得分:3)

这里需要考虑两个概念:

obj = new Boolean(false)

创建一个Object,其值为false。对象本身被认为是真实的,它的值(您使用toString()valueOf()获得)当然是布尔值false

(x||y)

返回第一个truthy值(如果不存在,则返回最后一个虚假值)和

(x&&y)

返回第一个假值(如果不存在,则返回最后一个真值)。

因此(obj||false)会返回布尔对象(obj&&true)会返回第二个(true)值。

进一步的先例取决于你表达的背景。

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

需要一个字符串上下文,因此在你的布尔对象上调用toString(),返回它的值false(虽然对象本身是真的!)。

此外,

(obj && true) == true比较true == true当然是真的。然而,

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

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

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

答案 1 :(得分:2)

对于第一种情况,obj是真实的&& true返回true。

对于第二种情况,它返回obj,即Boolean{}。如果你然后把它强制转换为String(如果你做"string" + (obj || false)则会发生),那么它将返回,这是“假”。

同样,这是因为objfalse,但对象本身是truthy值!

答案 2 :(得分:1)

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

在第二个例子中,评估对象时再次被认为是真实的,因此在评估obj之后,延迟评估会停止。然后返回obj,其本身会产生false的值。

答案 3 :(得分:0)

你的对象(obj)是一个包装的布尔值,JavaScript以这种方式对待它。

(新Boolan(假)|| false)确实是假的。

答案 4 :(得分:0)

我的Chrome浏览器在前一个语句中返回true 并为后一个语句返回一个布尔对象

答案 5 :(得分:0)

在得到以下答案之后,让我在这里做一个总结(StackOverFlow上的人真的很有帮助〜谢谢大家〜):

&&&和||运算符和对象的真值是我猜的问题的根源。

(以下是我尝试的几种行为总结的内容)

我会用:

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.