【问题标题】:why []==[] and {}=={} return false though [] and {} are truthy values? [duplicate]为什么 []==[] 和 {}=={} 返回 false 虽然 [] 和 {} 是真实值? [复制]
【发布时间】:2018-09-22 20:46:06
【问题描述】:

在 js 中,falsy 值是 0、null、undefined、false、NaN 和 '',其他都是真值。 所以,这意味着 [] 和 {} 也是真实值,但是当比较 []=={}[]==[]{}=={} 时返回 false,这是为什么呢?

【问题讨论】:

  • 因为它们没有引用相同的东西。
  • 引用相同的东西是什么意思?
  • @Pranab — 它们是两个相同的数组,而不是同一个数组。对象比较询问它们是否是同一个对象,而不是它们是否相同。
  • [](或{})是真值这一事实仅在布尔上下文中相关,此时[] 必须强制转换为布尔值。比较 []==[] 计算为布尔值,但不是每个 [] 的布尔上下文。

标签: javascript arrays object


【解决方案1】:

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

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

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

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


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

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

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

【讨论】:

  • 是的,5==6 是 false,因为它们的值不同,但是在数组或对象内部没有值,那么它们是如何返回 false 的?
  • @Pranab - 因为与 == 比较的对象引用仅在它们引用同一个对象时才返回 true
  • 我已经修改了答案。
  • @Pranab - 这可能会有所帮助,比较数组不会检查数组的内容是否相同,它会检查数组是否相同。注意:[1,2] == [1,2] 也是错误的,因为它检查数组是否是同一个 JavaScript 对象,而不是检查它们是否包含相同的东西。
  • 谢谢,我明白了……那么,[]==true 呢,它们也返回 false。意思是如果用 [] 或 {} 比较任何东西,那么每次我都会得到错误,对吧?
【解决方案2】:

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

所以这样看:

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

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

【讨论】:

  • 谢谢,@Adam,我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2017-09-25
  • 2021-11-10
  • 2013-01-14
  • 1970-01-01
  • 2017-07-27
  • 2016-11-14
相关资源
最近更新 更多