在js中,falsy值为0,null,undefined,false,NaN和''其他一切都是真实的。
因此,这意味着[]和{}也是真值,但在比较[]=={}
或[]==[]
或{}=={}
时返回false,为什么会这样?
答案 0 :(得分:4)
如果有两件事是“真实的”,那并不代表他们“平等”或“相同”。
例如,5
和6
是“真实的”,但你会发现(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
为真,因为它们引用了两个不同的数组。