Javascript新对象的构造函数([])/ new Object(new Array())

时间:2014-09-12 15:46:26

标签: javascript object constructor prototype

关于:new Object(new Array())

这是一个非常基本的问题,我自己真的无法得到答案,我正在寻求建议:
使用以下方法在js中实例化对象时:
var obj = new Object();
很明显: obj.constructor === Object

然而

当做一些稍微不同的事情时,例如实例化Array类型的对象:

var obj = new Object([]);

变得
obj.constructor === Array

这里到底发生了什么?我完全明白为什么在第一个例子中obj.constructor ===对象
但是为什么在通过新对象创建数组时obj数组的构造函数?

第一卷上obj的构造函数不是必须是Object.constructor吗?

如  var obj = new Object([]);与var obj = new Object(new Array());

相同
  • 这是否意味着由新的Object返回的构造函数 本身创建另一种类型的新对象,总是如此 最新/最新分配在"链"?
  • 或者对象只是先从它继承构造函数 参数(特定类型)?


Cheerio

1 个答案:

答案 0 :(得分:1)

让我们看看规范:

  

15.2.2.1 new Object ( [ value ] )
  如果在没有参数或具有一个参数值的情况下调用Object构造函数,则执行以下步骤:

     
      
  1. 如果提供,则
      一个。如果Type( value )是Object,那么
      一世。如果值是本机ECMAScript对象,请不要创建新对象,只需返回 value
  2.   

这意味着,如果将对象传递给Object,它只返回相同的值。因此var obj = new Object([]);var obj = [];实际上是一样的,我们可以轻松地测试:{/ p>

> var arr = []; // or var arr = new Array();
> var obj = new Object(arr);
> arr === obj;
true

如果传递的参数不是对象,则会将其转换为对象,例如

> typeof new Object("string")
'object'

如果您不提供任何参数,它只会返回一个新对象:

> new Object()
Object {}

另请注意,根据规范,Object(...)的行为与new Object(...)完全相同。