JavaScript 中的对象具有唯一的身份。您通过构造函数或文字等表达式创建的每个对象都被认为与其他所有对象不同。
这背后的原因是什么?
{}==={}//output:false
出于什么原因他们受到不同的对待?是什么让它们彼此不同?
JavaScript 中的对象具有唯一的身份。您通过构造函数或文字等表达式创建的每个对象都被认为与其他所有对象不同。
这背后的原因是什么?
{}==={}//output:false
出于什么原因他们受到不同的对待?是什么让它们彼此不同?
{}
创建一个新对象。
当您尝试比较两个单独的新对象(引用)时,它们永远不会相等。
布置它:
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
它们是对象的不同实例,可以独立修改。即使它们(当前)看起来相似,但它们并不相同。有时通过它们的(属性)值比较它们可能很有用,但在有状态编程语言中,对象相等通常是它们的标识。
在这种情况下,它们不同的事实很重要:
a={};
b={};
a.some_prop = 3;
在这一点上,您显然会知道这b.some_prop
将是未定义的。
==
or运算符因此===
允许您确保您没有更改某些对象的属性,即您不想更改
这个问题已经很老了,但我认为到目前为止,在给定的答案中,实际的解决方案还不够清楚。
出于什么原因他们受到不同的对待?是什么让它们彼此不同?
我理解您的痛苦,互联网上的许多来源并没有直接说明这一事实:
对象(复杂的 JS 类型 => 对象、数组和函数)变量只存储引用(=内存中实例的地址)作为它们的值。对象身份由引用身份识别。
你期望对象内部有一个 ID 或引用之类的东西,你可以用它来区分它们(也许这实际上是在引擎盖下透明地完成的)。但是每次实例化一个对象时,都会在内存中创建一个新实例,并且只有对它的引用存储在变量中。
因此,当 ===-operator 的描述说它比较值时,它实际上意味着它比较引用(而不是属性及其值),只有当它们指向完全相同的对象时它们才相等。
本文详细解释:https ://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0
BR迈克尔
这两个对象都作为单独的实体在内存中创建。准确地说,这两个对象都是在堆上创建为单独的实体(JavaScript 引擎使用堆和堆栈内存模型来管理正在运行的脚本)。因此,这两个对象可能看起来相同(结构、属性等),但实际上它们在内存中有两个独立的地址。
这是给你的一些直觉。想象一个新的社区,所有的房子看起来都一样。您决定再建造两座相同的建筑物,完成建造后,这两座建筑物看起来都一样,甚至连“坐”在一起,但它们仍然不是同一栋建筑物。他们有两个不同的地址。
我认为最简单的答案是“它们存储在内存中的不同位置”。虽然在隐藏指针的语言中并不总是很清楚(如果你知道 C、C++ 或汇编语言,你就会知道指针是什么,如果不知道,学习低级语言是有用的学习)通过将所有内容都设为指针,每个“ object”实际上是指向内存中存在对象的位置的指针。在某些情况下,两个变量将指向内存中的相同位置。在其他情况下,它们将指向内存中恰好具有相似或相同内容的不同位置。这就像有两个不同的 URL,每个 URL 都指向一个相同的页面。网页彼此相等,但 URL 不相等。