var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???
我不想得到“建议使用
===
而不是 ==
”的答案。
我想了解这种现象的原因和JavaScript类型转换的原理。var arr = [];
Boolean(arr) // true
Boolean(!arr) // false
arr == arr // true
arr == !arr // true ??? what ???
===
而不是 ==
”的答案。
我想了解这种现象的原因和JavaScript类型转换的原理。[] == false
,操作数A是一个对象,操作数B是一个布尔值,因此执行的实际比较将是ToPrimitive(A)== ToNumber(B)
。ToNumber(false)
计算结果为0
。做完了。ToPrimitive
的完整文档,但您只需要知道,在这种情况下,它归结为A.valueOf().toString()
,在空数组的情况下仅为空字符串""
。"" == 0
。字符串/数字==
比较在字符串上执行ToNumber
操作,而ToNumber("")
为0
,因此我们得到0 == 0
,当然是true
。双等号==
在尝试检查相等性之前对值执行一定的类型强制转换。
因此,arr == arr
返回true,就像您期望的那样,因为您实际上正在检查的是[] == []
,并且等式两侧的类型相同。
arr ==!arr
实际上是在检查[] == false
。然后,==
对[]
值执行类型强制转换。正如Hamms指出的那样,这不执行布尔转换,而是将[]
转换为原始值,由于某些原因,它变成了一个空字符串。现在我们的等式是'' == false
。这个操作的两边的类型仍然不同。所以类型强制转换再次启动,并且由于JavaScript中的真值和假值,''
也被评估为false。方程现在变成了false == false
,显然是true。
[]
也会被视为 false?如果这个说法是正确的,为什么 Boolean([])
返回 true? - Isaac[ ] == false // true
? - msm082919[] == false
,但在这种情况下,JS实际上会将第一个操作数转换为其ToPrimitive
值,而不是其ToBoolean
值,而空数组的原始值实际上是空字符串。 - Hamms'x' == true
或 '0' == false
。 - Ry-
[]
是假值(尝试[] == 0
),但!arr
变成了!Boolean(arr)
,它给出了!true
或false
。==
运算符可能不会在左侧的arr
上调用Boolean()
,因为它知道将空列表视为假值。 - Dillon Davis[] == []
是错误的。 - Steve Bennett[]
会被视为false。 - Dillon Davis[]
是真值。 - Ry-