运行此代码会产生注释中的结果,但为什么会这样?
let a = [1,2,3];
let b = [1,2,3];
let c = '1,2,3';
a == c; // true
b == c; // true
a == b; // false
我注意到,如果您使用以下更改前面的代码,最终结果会更改:
let a = [1, 2, 3];
let b = [1, 2, 3];
let c = '1, 2, 3';
a == c; // false
b == c; // false
a == b; // false
谢谢!
答案 0 :(得分:3)
请参阅this article,其中介绍了JavaScript中不同类型的相等性检查。
a == c; // true
b == c; // true
以上两者都返回true,因为==
导致数组使用其toString
方法转换为其等效字符串(因为它与使用==
运算符的字符串进行比较),返回"1,2,3"
。显然,"1,2,3"
等于"1,2,3"
。
a == b; // false
上面的内容返回false,因为a
和b
是两个不同的数组,JavaScript会通过引用对它们进行比较,而不是遍历每个元素并单独比较它们或将它们转换为等效的字符串。
答案 1 :(得分:1)
@blurstream关键是从数组到字符串的隐式转换将测试从没有空格的"[1,2,3]" == "[1,2,3]"
更改为"[1,2,3]" == "[1, 2, 3]"
和空格。这就是它改变的原因。
数组[1, 2, 3]
被JavaScript理解为[1,2,3]
,没有空格。这改变了测试!
更具体地说,这会从"[1,2,3]" == "[1,2,3]"
(返回true
)更改为"[1,2,3]" == "[1, 2, 3]"
,返回false
。