2

要查看结果,请在 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)

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

(嗯..我也在下面给出了一个总结作为答案)

4

6 回答 6

3

这里需要考虑两个概念:

obj = new Boolean(false)

创建一个对象,其值为false。Object 本身被认为是真实的,它的值(你用toString()or得到valueOf())当然是 boolean value false

(x||y)

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

(x&&y)

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

所以(obj||false)返回您的Boolean Object(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 == 1which 产生 false。

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

于 2013-05-14T08:31:35.560 回答
2

对于第一种情况,obj是一个真实值,所以 true && true 返回 true。

对于第二种情况,它返回 obj Boolean{}。如果您随后将其转换为 String (如果您这样做,则会发生这种情况"string" + (obj || false)),那么它将返回其value,即“false”。

同样,这是因为 is 的值但Object本身是一个值!objfalsetruthy

于 2013-05-14T08:15:54.607 回答
1

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

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

于 2013-05-14T08:13:36.527 回答
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"

当使用 && 时,它将采用第一个非真值。由于对象本质上是真实的,因此它会尝试返回最后一个出现的对象,或者如果有,则返回第一个 false。

这是一个例子:

(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.
于 2013-05-14T09:09:00.460 回答
0

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

于 2013-05-14T08:15:41.400 回答
0

您的对象 (obj) 是一个包装的布尔值,JavaScript 就是这样对待它的。

(new Boolan(false) || false) 确实是错误的。

于 2013-05-14T08:13:34.643 回答