为什么[] == []和{} == {}返回false虽然[]和{}是真值?

时间:2018-04-12 15:51:47

标签: javascript arrays object

在js中,falsy值为0,null,undefined,false,NaN和''其他一切都是真实的。 因此,这意味着[]和{}也是真值,但在比较[]=={}[]==[]{}=={}时返回false,为什么会这样?

2 个答案:

答案 0 :(得分:4)

如果有两件事是“真实的”,那并不代表他们“平等”或“相同”。

例如,56是“真实的”,但你会发现(5 == 6) === false并不会感到惊讶,是吗?

JavaScript中的表达式[]表示“创建一个新数组”。如果你连续两次这样做,那就意味着“创建一个数组,然后创建另一个数组”。如果你然后比较这两个数组,为什么你会期望它们是相同的?

类似地,表达式{}表示“创建一个新对象”,所以如果你这样做两次,那就是两个不同的对象。

更深层次的答案是:JavaScript比较“浅薄”。这意味着它不会在值“内部”比较它们的内部,它只比较表面上的内容。

对于基本类型,例如数字或字符串,比较“在表面”意味着“按值比较”。但是对于更复杂的值,例如数组或对象,比较“在表面”意味着“通过引用进行比较”。这就是为什么两个不同但显然相同的对象在比较运算符=====意义上并不“相等”。

某些语言(如C#或Haskell)允许定义(有时是自动的)“相等”的自定义含义。其他语言,例如F#或Ocaml,甚至默认为所有类型提供所谓的“结构相等”(即比较所有内部,底部)。 JavaScript不是这种语言之一。

答案 1 :(得分:1)

当您输入[]时,您实际上正在撰写new Array(){}new Object同上。)

所以这样看:

let x = new Array();
let y = new Array();

你不会指望x == y为真,因为它们引用了两个不同的数组。