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

时间:2018-07-13 06:54:49

标签: javascript frontend

仅显示代码:

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

让我感到困扰的是为什么结果是true而不是false吗?

1 个答案:

答案 0 :(得分:2)

因为这就是Object constructor的定义方式。如果您传递的参数是一个对象,则仅返回该对象而不是新的对象。 (理论上,new创建了一个新对象,但随后将其丢弃;实际上,可以将其优化掉—请参阅下面的“注释”。)

Object构造函数中的逻辑(忽略次要细节)是:如果未给出自变量,或者自变量是nullundefined,则创建并返回一个新对象;否则,返回将参数转换为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:也许值得注意的是,永远不需要将newObject构造函数一起使用。 Object有点奇怪:根据规范的定义,它完全忽略了new创建的对象。 new Object()Object()new Object(value)Object(value)做同样的事情。再次,这是不寻常的。