在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
将是未定义的。
因此, ==
或 ===
运算符允许您确保您不会更改某个对象的属性,而您不希望更改。
这两个对象都是在内存中作为单独的实体创建的。准确地说,这两个对象都是在堆上作为单独的实体创建的(JavaScript 引擎使用堆和栈 内存模型 来管理运行脚本)。因此,这两个对象可能看起来相同(结构、属性等),但在底层它们在内存中有两个不同的地址。
这里有一些直觉。想象一个所有房子看起来都一样的新社区。你决定建造另外两座完全相同的建筑物,在完成建设后,这两座建筑物看起来完全相同,甚至“坐”在一起,但它们仍然不是同一座建筑物。它们有两个不同的地址。
我认为最简单的答案是“它们存储在内存中的不同位置”。虽然在隐藏指针的语言中并不总是清晰(如果您了解C、C++或汇编语言,您就知道指针是什么,否则学习低级语言是有用的),通过将每个“对象”都变成指针,实际上每个“对象”都是指向内存中对象存在的位置的指针。在某些情况下,两个变量将指向内存中的相同位置。在其他情况下,它们将指向具有类似或相同内容的不同内存位置。这就像有两个不同的URL,每个URL都指向相同的页面。网页彼此相等,但URL不同。
{}
本质上是new Object()
,这可能是他正在寻找的类型。 - Michael Ward