JavaScript中的new Object()时发生了什么



只显示代码:

const a = {
age: 1
};
const b = new Object(a);
console.log(a === b); //true

这让我很困惑,为什么结果是true而不是false

因为Object构造函数就是这样定义的。如果你传递给它的参数是一个对象,它只返回那个对象,而不是一个新对象。(理论上,new创建了一个新对象,但随后被丢弃;在实践中,可以对其进行优化,请参阅下面的"注意"。(

忽略一个次要细节,Object构造函数中的逻辑是:如果没有给定参数,或者参数是nullundefined,则创建并返回一个新对象;否则,返回将参数转换为对象的结果。由于您传递的参数已经是一个对象,因此该转换不必执行任何操作。

为了完整起见:构造函数通常可以通过返回一个非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:也许值得注意的是,将newObject构造函数一起使用从来都不是必需的。Object是一个有点奇怪的构造函数:根据规范的定义,它完全忽略new创建的对象。new Object()Object()的作用与new Object(value)Object(value)的作用相同。同样,这是不寻常的。

最新更新