This question already has answers here:
Why doesn't equality check work with arrays
                                
                                    (8个答案)
                                
                        
                2年前关闭。
            
        

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

最佳答案

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

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

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

类似地,表达式{}的意思是“创建一个新对象”,因此,如果两次执行该操作,则将成为两个不同的对象。



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

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

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

10-08 04:38