我想知道为什么标题中给出的表达式
[] == ![]
评估为true
。
您无法将数组作为字符串进行比较。我明白了。如果
[] == []
将评估为false,因为引用不同。虽然我们有以下声明。
var arr = [];
arr == arr // this evaluates to true simply because references are the same.
为了A == B返回true
,A和B必须是false
或true
。
A ==!B为了返回true
A可以是true
而B可以是false
,反之亦然,但在这种情况下,A和B是相同的值,所以我不喜欢得到它。
答案 0 :(得分:10)
基本上,如果两种类型不相同,Javascript会尝试将两边都转换为数字。如果它是一个Object,它会尝试转换为原始值
所以在这种情况下,一步一步将是
=> []==![]
=> []==false // Type conversion by the statement itself
=> []==0 // To number of right operand
=> ""==0 // To Primitive call for Array which will in this case convert to empty string
=> 0==0 // To number call of "" which is 0
=> true
可以在编译器描述http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
中检查ecmascript说明答案 1 :(得分:4)
![]
评估为false
,因为该引用是真实的。 []
可以转换为数字(在这种情况下为0),这是假的。因此:条件平等。如果你做===
那就错了。
答案 2 :(得分:3)
每当使用==比较2个值时,javascript执行抽象等式比较算法。
这里,x是[],y是![]。 此外,
typeof([]) // "object"
typeof(![]) // "boolean"
由于y是布尔值而x是对象,因此条件7是第一个保持:
如果Type(y)是布尔值,则返回比较结果x == ToNumber(Y)。
ToNumber(y)的价值是什么?
Number(![]) // 0
因为[]是一个真正的值,否定使它变为虚假。数字(假)为0
现在我们进行比较:[] == 0。
由于typeof(0)是“number”,条件8现在成立:
如果Type(x)是Object而Type(y)是String或Number,则返回 比较结果ToPrimitive(x)== y。
ToPrimitve(x)就像x.toString()。
[].toString() // ”” - the empty string
我们现在几乎完成了比较:“”== 0
现在,条件5成立:
如果Type(x)是String而Type(y)是Number,则返回结果 比较ToNumber(x)== y。
ToNumber(“”) // 0
最后,两个操作数具有相同的类型和条件1。我想你可以从这里拿走:))
在规格上阅读Abstract Equality Comparison!
答案 3 :(得分:2)
在了解正在发生的事情之前,我们需要了解JavaScript中的truthy和falsy的概念以及如何实现! (逻辑NOT)运算符工作。 false, null, undefined, NaN, 0, '' and ""
等值被视为虚假。
其他值如*true, {}, [], "foo"
*等被认为是真实的。
的!另一方面,运算符仅针对布尔值定义。
操作时,任何其他数据类型将自动强制转换为相应的布尔值!运营商。
在这里,![]
的计算结果为false,而比较实际上变为'[] == false'
,其评估为'true'
。
这不应该是假的,因为空阵列是真的吗?
这是正确的,但双等运算符会评估某些规则的表达式。
我们试图将一个对象与一个布尔值进行比较,JavaScript将隐式地将操作数转换为Number类型。 Number([]) is 0
和Number(false) is also 0
,评估为true since zero is equal to zero
答案 4 :(得分:0)
你的理解是正确的,但你错过了!运算符要求将空数组显式强制转换为布尔值。
[] ==![]
中的步骤所以0 == 0,这是真的。
答案 5 :(得分:-1)
Array是javascript中的一个特殊对象,可以与自定义对象进行比较。 即使它的类型是对象,[] instanceof Array == true;
所以使用var x = [];与调用Array构造函数完全相同。并且比较javascript中的两个对象实例将返回false,因为它们不共享相同的内存地址。这就像一个指针比较。