`[1] == [1]` 返回 "false",而 `[1] == 1` 返回 "true"?

3
我发现javascript中存在奇怪的行为。
var v1 = [1];
var v2 = [1];

v1 == v2  // false

v1 == 1 //true

[1] == [1] // false

1 == [1]    // true

为什么 [1] == [1] 返回 false,而[1] == 1 返回 true

数组是对象,所以 [1] == [1] 比较的是两个不同的对象。我不确定为什么 [1] == 1。 - Chris
https://dev59.com/Z3RC5IYBdhLWcg3wROpQ - Jonathan Allard
忘记在JavaScript中使用==。只使用=== - Kirill Slatin
1
在Javascript中,“==”基本上是邪恶的。除非你明确想要类型转换并且完全理解它在代码遇到所有情况时会做什么,否则几乎总是应该避免使用它。 - jfriend00
1个回答

6
规范指出,如果==的两个操作数彼此具有相同的类型(例如,在[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的结果为true。

1
@DyrandzFamador 是的,你几乎总是应该使用 ===== 变体应该小心使用,并且始终附带一个描述隐式转换原因的注释。通常最好使用 === 并在比较之前显式地转换类型,例如使用 +strparseInt( str, 10 ) 将字符串转换为数字。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接