我有两个这样的陈述。为什么它们都求值为false
?
console.log([] == true)
console.log(![] == true)
如果[] == true
是false
,![] == true
是否应归于true
?
答案 0 :(得分:7)
coercion的工作方式。
强制的第一步是将任何非原始类型转换为原始类型,然后使用一组规则将左侧,右侧或两侧转换为相同类型。您可以找到这些规则here。
对于您的情况[] == true
,将通过以下4个步骤:
[] == true
[] == 1
"" == 1
0 == 1
首先执行基于operator precedence的!
中的![] == true
,以便将表达式转换为显然是false == true
的{{1}}。
您可以尝试live demo的Felix Kling,以更好地了解相同性运算符的工作原理。
答案 1 :(得分:2)
按照抽象平等比较算法-http://es5.github.io/#x11.9.3
要检查
x == y
时要检查x和y的类型。如果没有规则匹配,则返回false。
[] == true
,规则7匹配,因此返回[] == ToNumber(true)
的结果,即返回false
。 ![] == true
返回 ![]
,而false
返回 false == true
,因此 false
的结果相同。要在第二次操作中获得相反的结果,请使用大括号在表达式中添加优先级(即换行)。
console.log(!([] == true)); // returns true
答案 2 :(得分:1)
将![]
放入控制台。是false
。
因此![] == true
与false == true
相同,即false
。
[] != true
是true
答案 3 :(得分:1)
到目前为止,没有一个答案解决了主要问题。 [编辑:这不再是事实。请参阅Nick Zoum的答案。]
问题本质上是这样的:
isModalInPresentation = true
返回[] == true
=> false
不是[]
=> true
为[]
(因为不正确的内容必须为假)
=> false
应该是![]
,因为true
的取反是false
。那么为什么true
返回![] == true
?
false
实际上是真实的。 (所以[]
实际上是虚假的。)
仍然,![]
返回[] == true
-原因是强制。这是Javascript的另一个陷阱。
在针对布尔值(即针对false
或true
)中显式检查数组是否相等时,其元素首先转换为字符串,然后连接在一起。因此,空数组变成false
-这是问题所在,因为空字符串是虚假的。
简而言之,一个空数组是真实的,但是(与布尔值比较时)它被强制为一个空字符串,这是虚假的。
请注意以下内容,它们来自https://www.nfriedly.com/techblog/2009/07/advanced-javascript-operators-and-truthy-falsy/
数组特别奇怪。如果您仅测试其真实性, 空数组是真实的。但是,如果将空数组与 布尔值,它变得虚假:
""
(这是因为进行比较时,其元素将转换为Strings并进行连接。由于它为空,因此它变成了“”,然后变得虚假。是的,这很奇怪。)
答案 4 :(得分:0)
阅读https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
JavaScript中的等于运算符(==)的规则
如果
type(x) type(y) result
1.x and y are the same type See Strict Equality (===) Algorithm
2.null Undefined true
3.Undefined null true
4. Number String x == toNumber(y)
5. String Number toNumber(x) == y
6. Boolean (any) toNumber(x) == y
7. (any) Boolean x == toNumber(y)
8.String or Number Object x == toPrimitive(y)
9.Object String or Number toPrimitive(x) == y
***10.otherwise… false