只显示代码:
const a = {
age: 1
};
const b = new Object(a);
console.log(a === b); //true
这让我很困惑,为什么结果是true
而不是false
?
因为Object
构造函数就是这样定义的。如果你传递给它的参数是一个对象,它只返回那个对象,而不是一个新对象。(理论上,new
创建了一个新对象,但随后被丢弃;在实践中,可以对其进行优化,请参阅下面的"注意"。(
忽略一个次要细节,Object
构造函数中的逻辑是:如果没有给定参数,或者参数是null
或undefined
,则创建并返回一个新对象;否则,返回将参数转换为对象的结果。由于您传递的参数已经是一个对象,因此该转换不必执行任何操作。
为了完整起见:构造函数通常可以通过返回一个非null
对象来使new
返回一个现有对象,而不是一个新对象。(如果构造函数没有返回任何东西(正常情况下(或返回非对象值(如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)
的作用相同。同样,这是不寻常的。