为何`Object() === new Object()`及同类空对象比较结果为`false`?
为什么
Object() === new Object()结果为false,以及new Object()和Object()创建的对象区别 首先得明确JavaScript里引用类型比较的核心规则:当用===比较对象(包括普通对象、数组、函数等)时,比较的是它们在内存中的引用地址,而不是对象的内容。只有当两个变量指向内存中同一个对象实例时,结果才会是true,否则哪怕两个对象内容完全一样,只要是不同的实例,结果都是false。
一、为什么Object() === new Object()是false?
不管是调用Object()作为普通函数,还是new Object()作为构造函数,每次调用都会在内存中创建一个全新的空对象实例。这两个实例虽然内容都是{},原型也相同,但它们在内存中占据的是不同的地址空间,所以用===比较时,结果自然是false。
二、new Object()和Object()创建的对象有什么区别?为什么a===b是false?
先看共同点:在你给出的例子里(无参数调用),a和b都是空的普通对象,它们的__proto__都指向Object.prototype,所以原型链完全一致,打印出来都是{}。
再讲细微区别:
new Object()是标准的构造函数调用流程:- 先创建一个全新的空对象;
- 将这个对象的
__proto__绑定到Object.prototype; - 执行
Object构造函数的函数体(这里Object构造函数没有额外逻辑); - 返回这个新对象。
Object()作为普通函数调用时,内部会做一个判断:- 如果没有传入参数,或者传入的是
null/undefined,它会直接返回一个和new Object()完全一样的空对象; - 如果传入的是原始值(比如字符串、数字、布尔值),它会把这个原始值包装成对应的包装对象(比如
Object(123)返回Number {123},和new Object(123)结果一致)。
- 如果没有传入参数,或者传入的是
但回到你的例子,不管是哪种调用方式,每次调用都会生成一个新的对象实例,a和b指向的是内存中两个不同的对象,所以a===b结果为false。
举个反例验证:
let a = new Object() let b = a // 让b指向a引用的同一个对象 console.log(a === b) // true
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

