仅显示代码:
const a = {
age: 1
};
const b = new Object(a);
console.log(a === b); //true
让我感到困扰的是为什么结果是true
而不是false
吗?
答案 0 :(得分:2)
因为这就是Object
constructor的定义方式。如果您传递的参数是一个对象,则仅返回该对象而不是新的对象。 (理论上,new
创建了一个新对象,但随后将其丢弃;实际上,可以将其优化掉—请参阅下面的“注释”。)
Object
构造函数中的逻辑(忽略次要细节)是:如果未给出自变量,或者自变量是null
或undefined
,则创建并返回一个新对象;否则,返回将参数转换为object的结果。由于您要传递的参数已经是一个对象,因此该转换无需执行任何操作。
仅出于完整性考虑:构造函数通常可以通过返回非new
对象,使null
返回现有对象,而不是新对象。 (如果构造函数不返回任何值(正常情况下)或返回非对象值(如42),则返回由new
创建的对象。)这是一个示例:
"use strict";
class Example1 {
constructor(arg) {
if (arg && typeof arg === "object") {
return arg;
}
}
}
const a = {};
const e1 = new Example1(a);
console.log(a === e1); // true
class Example2 {
constructor(arg) {
if (arg && typeof arg === "object") {
return arg;
}
return 42; // 42 isn't an object
}
}
const e2 = new Example2();
console.log(e2); // [object Object], not 42
注意:从理论上讲,使用new
总是创建一个新对象,然后,如果构造函数返回一个不同的对象,则新对象将被丢弃。实际上,如果构造函数不访问this
,则JavaScript引擎可以自由地优化新对象的创建。
注释2:也许值得注意的是,永远不需要将new
与Object
构造函数一起使用。 Object
有点奇怪:根据规范的定义,它完全忽略了new
创建的对象。 new Object()
和Object()
与new Object(value)
和Object(value)
做同样的事情。再次,这是不寻常的。