This question already has answers here:
Why doesn't equality check work with arrays
(8个答案)
2年前关闭。
在js中,伪造的值为0,null,undefined,false,NaN和”,其他一切都是真实的。
因此,这意味着[]和{}也是真实值,但是在比较
(8个答案)
2年前关闭。
在js中,伪造的值为0,null,undefined,false,NaN和”,其他一切都是真实的。
因此,这意味着[]和{}也是真实值,但是在比较
[]=={}
或[]==[]
或{}=={}
时返回false,这是为什么呢? 最佳答案
如果两件事是“真实的”,那并不意味着它们是“相等的”或“相同的”。
例如,5
和6
是“真实的”,但是您对发现(5 == 6) === false
并不感到惊讶,对吗?
JavaScript中的表达式[]
表示“创建新数组”。如果您连续执行两次,那将意味着“创建一个数组,然后创建另一个数组”。如果然后比较这两个数组,为什么还要期望它们相同?
类似地,表达式{}
的意思是“创建一个新对象”,因此,如果两次执行该操作,则将成为两个不同的对象。
一个更深层次的答案是:JavaScript比较是“浅”的。这意味着它不会“比较”值以比较其内部,而仅比较表面上的值。
对于原始类型(例如数字或字符串),“在表面”进行比较意味着“按值比较”。但是对于更复杂的值(例如数组或对象),“在表面”进行比较意味着“通过引用进行比较”。这就是为什么在比较运算符==
和===
的意义上两个不同的对象尽管看似完全相同,但却不“相等”的原因。
某些语言(例如C#或Haskell)允许(有时自动)定义“平等”的自定义含义。默认情况下,所有类型的其他语言(例如F#或Ocaml)甚至都提供所谓的“结构相等”(即,将所有内在函数与底部进行比较)。 JavaScript不是这样的语言之一。
10-08 04:38