为什么会这样?

时间:2018-05-04 15:31:16

标签: javascript

运行此代码会产生注释中的结果,但为什么会这样?

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

谢谢!

2 个答案:

答案 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,因为ab是两个不同的数组,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

P.S:我没有回复评论,而是因为我在这里缺乏声誉而给出答案,请原谅我。