Javascript对象标识

时间:2013-04-27 18:13:07

标签: javascript

JavaScript中的对象具有唯一标识。通过表达式(如构造函数或文字)创建的每个对象都被视为与其他所有对象不同。

这背后的原因是什么?

{}==={}//output:false

为什么他们被区别对待?是什么让他们彼此不同?

5 个答案:

答案 0 :(得分:5)

{}会创建对象。

当您尝试比较两个 new 对象(引用)时,它们永远不会相等。

说出来:

var a = {};  // New object, new reference in memory, stored in `a`
var b = {};  // New object, new reference in memory, stored in `b`

a === b;  // Compares (different) references in memory

如果有帮助,{}new Object()的“捷径”,那么更明确:

var a = new Object();
var b = new Object();

a === b;  // Still false

也许new的明确性可以帮助您理解比较比较不同的对象。

另一方面,如果参考指向同一个对象,则 可以相等。例如:

var a = {};
var b = a;

a === b;  // TRUE

答案 1 :(得分:4)

是对象的不同实例,可以单独修改。即使他们(目前)看起来很相似,但他们并不相同。通过它们的(属性)值比较它们有时是有用的,但在有状态编程语言中,对象相等通常是它们的身份。

答案 2 :(得分:1)

在这种情况下,它们不同的事实很重要:

a={}; b={}; a.some_prop = 3;

此时你显然知道b.some_prop将是未定义的。

=====运算符因此可以确保您不会更改某些对象的属性,而您不想更改

答案 3 :(得分:0)

这个问题已经很老了,但我认为到目前为止,实际的解决方案在给定的答案中还不够清楚。

<块引用>

为什么他们会受到不同的对待?是什么让他们 彼此不同?

我理解你的痛苦,互联网上的许多消息来源并没有直接说明事实:

对象(复杂的 JS 类型 => 对象、数组和函数)变量只存储引用(=内存中实例的地址)作为它们的值< /强>。对象标识由引用标识识别。

您期望在对象内部有一个 ID 或引用之类的东西,您可以用它来区分它们(也许这实际上是在幕后透明地完成的)。但是每次实例化一个对象时,都会在内存中创建一个新实例,并且只有对它的引用存储在变量中。

所以,当 ===-operator 的描述说它比较值时,它实际上意味着它比较引用(而不是属性及其值),只有当它们指向完全相同的对象时才相等.

这篇文章详细解释了:https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0

BR 迈克尔

答案 4 :(得分:0)

这两个对象都是在内存中作为单独的实体创建的。准确地说,这两个对象都是在堆上作为一个单独的实体创建的(JavaScript 引擎使用堆和堆栈 memory models 来管理正在运行的脚本)。因此,这两个对象可能看起来相同(结构、属性等),但实际上它们在内存中有两个不同的地址。

这是给你的一些直觉。想象一个新社区,所有房屋看起来都一样。你决定再建造两座相同的建筑物,在完成建造后,这两座建筑物看起来都一样,甚至“坐”在一起,但它们仍然不是同一栋建筑物。他们有两个不同的地址。