当你在JavaScript中实例化一个带有参数的新对象(1)时会发生什么?

What happens when you instantiate a new Object(1) with a parameter in JavaScript?

本文关键字:对象 新对象 什么 实例化 JavaScript 当你 一个 参数      更新时间:2023-09-26

当你调用:

new Object(1)

当我尝试它时,它返回:

[Number: 1]

我想知道那里发生了什么。

你可以看说明书:

new Object(arg)被调用时,我们实际上是在调用ToObject(arg)

ToObject定义为

抽象操作ToObject根据表13将实参转换为Object类型的值

表格显示:

Number:返回一个新的Number对象,其[[NumberData]]内部槽位被设置为argument的值。Number对象的描述请参见20.1。

所以它和调用new Number(1)是一样的,也就是说它创建了一个数字对象。


基本数据类型 String、Number和Boolean具有等效的对象值,可以通过调用等效的构造函数来创建。但这不是一个常见的事情,因为对象值的行为不同于原始值,也就是说,在某些情况下,数字原始值的行为与数字对象的行为不同。

的例子:

Boolean(0); // false
Boolean(new Number(0)); // true

以下是默认构造函数的文档:http://www.ecma-international.org/ecma-262/5.1/sec-15.2.2.1

调用Object构造函数时不带参数或带参数参数值时,执行以下步骤:

  • 如果value被提供,则
    • 如果Type(value)为Object,则
      • 如果值是一个本地ECMAScript对象,不要创建一个新对象,而只是返回值。
      • 如果值是主机对象,则采取操作并以依赖于实现的方式返回结果可能取决于宿主对象。
    • 如果Type(value)是String,返回ToObject(value)。
    • 如果Type(value)是Boolean,则返回ToObject(value)。
    • 如果Type(value)为Number,则返回ToObject(value)。
  • Assert:没有提供参数值或参数类型为Null或Undefined。
  • 让obj成为一个新创建的原生ECMAScript对象。
  • 设置obj的[[Prototype]]内部属性为标准的内置Object原型对象(15.2.4)。
  • 设置obj的[[Class]]内部属性为"Object"。设置obj的[[Extensible]]内部属性为true。
  • 按照8.12的规定设置obj的所有内部方法。
  • 返回obj。