-5

以下代码导致错误的原因是什么?

{} === {}
//false

这段代码变成真的原因是什么?

 var obj = {};
 obj === obj
  //true

请用简单明了的语言回答

4

5 回答 5

4

对象的比较不检查对象是否具有相同的内容,而是检查它们是否是同一个对象。每个都{}创建一个新对象。您的第一个测试测试一个新对象是否与不同的新对象是一个对象。您的第二个测试将创建的对象与自身进行比较。

比较运算符的文档中

仅当操作数引用相同的对象时,比较对象的表达式才为真

或者,从语言规范

第 7 步:如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。

于 2013-04-02T15:20:44.963 回答
1

在第一种情况下,您正在创建两个对象并比较它们。在第二种情况下,您正在比较同一个对象。

于 2013-04-02T15:20:29.370 回答
0

当你这样做时,{}你正在创建一个(空)对象文字(一个没有属性的新对象)。当你在做

{} === {}

您正在比较两个完全不同的对象,所以它返回false.

但是,当您这样做时:

var obj = {};
obj === obj

你正在比较同一个对象,所以它返回true.

于 2013-04-02T15:21:07.380 回答
0

其次,您正在将一个对象与自身进行比较,这在逻辑上是相等的。

起初,您不是在比较相同的事物,而是尝试比较显示相同的事物。

于 2013-04-02T15:21:12.640 回答
0

{} 创建一个新对象。

=== 检查它们实际上是同一个对象。尽管它们都是新的空对象,但它们实际上是不同的空对象。

要了解为什么这很重要,请尝试以下操作:

var a = {};
var b = {};
var c = a;
a.key = 'value';
console.log(b);
console.log(c);

你会看到因为 a 和 b 是不同的空对象,所以改变 a 不会改变 b。因为 c 实际上和 a 是同一个空对象,所以将某物放入 a 也将其放入 c。

于 2013-04-02T15:21:36.463 回答