为什么[] == []和{} == {}返回假,尽管[]和{}是真实值?

Pra*_*nab 0 javascript arrays object

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

Fyo*_*kin 5

如果两件事是“真实的”,则并不意味着它们是“相等的”或“相同的”。

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

[]JavaScript中的表达式表示“创建新数组”。如果您连续执行两次,那将意味着“创建一个数组,然后创建另一个数组”。如果然后比较这两个数组,为什么还要期望它们相同?

同样,该表达式的{}意思是“创建一个新对象”,因此,如果您两次执行此操作,则这是两个不同的对象。


更深层的答案是:JavaScript比较是“浅”的。这意味着它不会“比较”值以比较其内部,而仅比较表面上的值。

对于原始类型(例如数字或字符串),“在表面”进行比较意味着“按值比较”。但是对于更复杂的值(例如数组或对象),“在表面”进行比较意味着“通过引用进行比较”。这就是为什么两个不同的对象(尽管看上去完全相同)在比较运算符==和之间不是“相等”的原因===

某些语言(例如C#或Haskell)允许(有时自动)定义“平等”的自定义含义。默认情况下,所有类型的其他语言(例如F#或Ocaml)甚至都提供所谓的“结构相等”(即,将所有内脏进行比较)。JavaScript不是这样的语言之一。

  • @Pranab-因为与`==`比较的对象引用只有在引用同一对象时才返回true。 (3认同)