javascript - 尽管 [] 和 {} 是真值,为什么 []==[] 和 {}=={} 返回 false?

标签 javascript arrays object

在 js 中,假值为 0、null、undefined、false、NaN 和 '',其他均为 true。 因此,这意味着 [] 和 {} 也是真值,但在比较 []=={} 时或[]==[]{}=={}返回 false,这是为什么?

最佳答案

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

例如,56 是“真实的”,但您不会惊讶地发现 (5 == 6) = == false,你愿意吗?

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

类似地,表达式 {} 的意思是“创建一个新对象”,因此如果执行两次,就会出现两个不同的对象。

<小时/>

更深入的答案是:JavaScript 比较是“浅薄的”。这意味着它不会进入值的“内部”来比较其内部结构,而只会比较表面的内容。

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

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

关于javascript - 尽管 [] 和 {} 是真值,为什么 []==[] 和 {}=={} 返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800933/

相关文章:

java - 如何仅使用 json-simple 从嵌套对象中的键获取值

java - java中的混合类型和混合数组类型数组Object []未编译

javascript - 使用 CSS 动态地为表中的替代行设置 bgcolor

javascript - 使用 groupBy 对数组进行分组

C++:使用动态内存分配编写类似于 C realloc() 函数的函数(即更改其大小)

Javascript array.prototype.every 在函数内部不起作用?

javascript - react /Electron 中的 "SyntaxError: Invalid regular expression flags"

javascript - 为什么这个迭代器返回以下值?

c# - 如何在 C# 中声明一个包含固定数量固定大小字符串的数组?

python - Python 3 中按对象迭代