我在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
?
我在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
?
的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
评估为真。
谢谢Paulpro。所以使用'===' –
@DyrandzFamador更安全是的,你应该总是使用'==='。应谨慎使用'=='变体,并始终使用描述隐式转换原因的注释。使用'==='几乎总是比较好,并且在比较类型之前显式转换类型。使用'+ str'或'parseInt(str,10)'将字符串转换为数字。 – Paulpro
数组是对象,所以[1] == [1]正在比较两个单独的对象。我不确定为什么[1] == 1. – Chris
http://stackoverflow.com/q/359494/720164 –
忘掉javascript中的==。只使用'===' –