2016-07-29 50 views
12

我就喜欢四处知道为什么在标题[] ==![]的值为true

[] == ![]

给定的表达式评估为真。

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

[] == []

将评估为假,因为引用是不同的。虽然如果我们有以下陈述。

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是相同的值,所以我不明白。

+6

这个问题没有错。它不配得到降价。如果你不同意,你应该留下评论和解释。 – Brad

+0

也许蒂姆又放下钥匙了? – Li357

+0

我不知道为什么会有人低估这一点。这不是很明显。对布拉德的陈述+1 +1 – Tek

回答

4

![]的计算结果为false,因为参考文献是truthy。 []可以转换为一个数字(在这种情况下为0),这是错误的。因此:条件平等。如果你做了===这将是错误的。

+2

'[]'并不虚假。 '[]'是一个对象。在你的浏览器中试一试:'if([])console.log('not falsey')' –

+1

这个答案是不正确的。 – Brad

+2

我很确定[它会转换成数字,而不是字符串](http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)。 – Quentin

-1

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

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

+0

问题不在于比较两个数组。这是关于将数组与布尔值进行比较的。 – Quentin

+0

uups ..我的错 – Wolfgang

6

基本上,如果两个类型都不相同,Javascript会尝试将两边都转换为数字。而如果一个对象,它试图转换为原始值

因此,在这种情况下,一步一步地将

=> []==![] 

=> []==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 

人们可以在编译器中的描述在这里检查ECMAScript的解释http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

1

这里有更详细的解释从codementor.io

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

1

每当使用==比较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)是 “数字”,条件8现在持有:

如果Type( x)是Object和Type(y)是String或Number,返回 ToPrimitive(x)== y的比较结果。

ToPrimitve(x)就像x.toString()。

[].toString() // ”” - the empty string 

差不多完成了,我们现在用的比较脸:“” == 0

现在,条件5成立:

如果Type(x)的字符串和类型(y)为数字,返回 比较ToNumber(x)== y的结果。

ToNumber(“”) // 0 

最后两个操作数具有相同的类型和条件1成立。我认为你可以采取,如果从这里:)

阅读关于Abstract Equality Comparison在规格!

相关问题