[] ==![]计算结果为true

时间:2016-07-29 15:16:48

标签: javascript arrays compare

我想知道为什么标题中给出的表达式

[] == ![]

评估为true

您无法将数组作为字符串进行比较。我明白了。如果

[] == []

将评估为false,因为引用不同。虽然我们有以下声明。

var arr = []; 
arr == arr // this evaluates to true simply because references are the same.

为了A == B返回true,A和B必须是falsetrue。 A ==!B为了返回true A可以是true而B可以是false,反之亦然,但在这种情况下,A和B是相同的值,所以我不喜欢得到它。

6 个答案:

答案 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执行抽象等式比较算法。

enter image description here

这里,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)

以下是codementor.io

的详细说明

在了解正在发生的事情之前,我们需要了解JavaScript中的truthy和falsy的概念以及如何实现! (逻辑NOT)运算符工作。 false, null, undefined, NaN, 0, '' and "" 等值被视为虚假。 其他值如*true, {}, [], "foo" *等被认为是真实的。 的!另一方面,运算符仅针对布尔值定义。 操作时,任何其他数据类型将自动强制转换为相应的布尔值!运营商。 在这里,![]的计算结果为false,而比较实际上变为'[] == false',其评估为'true'。 这不应该是假的,因为空阵列是真的吗? 这是正确的,但双等运算符会评估某些规则的表达式。  我们试图将一个对象与一个布尔值进行比较,JavaScript将隐式地将操作数转换为Number类型。 Number([]) is 0Number(false) is also 0,评估为true since zero is equal to zero

答案 4 :(得分:0)

你的理解是正确的,但你错过了!运算符要求将空数组显式强制转换为布尔值。

[] ==![]

中的步骤
  1. 显式强制右侧表达式为布尔值!运营商。 所以,![]变成了假。
  2. 现在==运算符的动作。由于其中一个是布尔值(在==运算符的右侧为假)。这将强迫数字。
  3. 其中[]将被强制为数字0。
  4. 所以0 == 0,这是真的。

答案 5 :(得分:-1)

Array是javascript中的一个特殊对象,可以与自定义对象进行比较。 即使它的类型是对象,[] instanceof Array == true;

所以使用var x = [];与调用Array构造函数完全相同。并且比较javascript中的两个对象实例将返回false,因为它们不共享相同的内存地址。这就像一个指针比较。