JavaScript中的对象具有唯一标识。通过表达式(如构造函数或文字)创建的每个对象都被视为与其他所有对象不同。
这背后的原因是什么?
{}==={}//output:false
为什么他们被区别对待?是什么让他们彼此不同?
答案 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 来管理正在运行的脚本)。因此,这两个对象可能看起来相同(结构、属性等),但实际上它们在内存中有两个不同的地址。
这是给你的一些直觉。想象一个新社区,所有房屋看起来都一样。你决定再建造两座相同的建筑物,在完成建造后,这两座建筑物看起来都一样,甚至“坐”在一起,但它们仍然不是同一栋建筑物。他们有两个不同的地址。