2015-07-04 181 views
3

我在javascript中发现了这个奇怪的行为。`[1] == [1]`返回“false”并且`[1] == 1`返回“true”?

var v1 = [1]; 
var v2 = [1]; 

v1 == v2 // false 

v1 == 1 //true 

[1] == [1] // false 

1 == [1] // true 

那为什么[1] == [1]回报false[1] == 1回报true

+0

数组是对象,所以[1] == [1]正在比较两个单独的对象。我不确定为什么[1] == 1. – Chris

+0

http://stackoverflow.com/q/359494/720164 –

+0

忘掉javascript中的==。只使用'===' –

回答

6

spec says的是,如果==两个操作数具有相同的类型彼此(例如在[1] == [1]情况下,当它们两者都Object型),然后==方法类似于===。这两个数组并非完全相同的对象,因此返回false。注意:

var v1 = [1]; 
var v2 = v1; 

v1 == v2; // true 

当操作数有不同的类型,它们都裹挟。在1 == [1]的情况下,来自上述链接的规则10首先适用,并且该数组被转换为基元,其toString()返回'1'。然后应用规则6(将字符串'1'转换为数字1),比较变为1 == 1,最后它们具有相同类型并与===进行比较。显然1 === 1评估为真。

+0

谢谢Paulpro。所以使用'===' –

+1

@DyrandzFamador更安全是的,你应该总是使用'==='。应谨慎使用'=='变体,并始终使用描述隐式转换原因的注释。使用'==='几乎总是比较好,并且在比较类型之前显式转换类型。使用'+ str'或'parseInt(str,10)'将字符串转换为数字。 – Paulpro