要查看结果,请在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)
返回布尔对象,而不是布尔值?
(嗯..我还在下面写了一个总结答案)
答案 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)
则会发生),那么它将返回值,这是“假”。
同样,这是因为obj
的值是false
,但对象本身是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.