2011-04-29 112 views
31

我刚开始考虑这个问题,但无法在jsFiddle附近暴露自己的任何区别。在JavaScript中Array(1)和new Array(1)有什么区别?

var a = new Array(1), 
    b = Array(1); 

console.log(a, b); 

输出是两个具有一个未定义成员的数组。

做一个for (in)显示它们具有相同的属性。

这些之间的区别是什么?第一个是否明确地实例化对象?

请不要讲我使用数组文字符号,因为我已经知道这一点。我更愿意填补我上面解释的知识空白。

+1

[JS中的新关键字](http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript) – 2011-04-29 01:48:58

+0

我将采取一个野生刺伤它,并说新意味着它是一个没有新的东西的对象不是。新的将有这里描述的方法http://www.w3schools.com/jsref/jsref_obj_array.asp而没有新的不会。 – Flipper 2011-04-29 01:49:17

+0

@Flipper我遍历每个属性,他们都似乎有相同的方法。 – alex 2011-04-29 01:49:54

回答

31

Array,两者都是等价的。

15.4.1 Array构造函数作为函数调用

Array被称为函数,而不是作为一个构造函数,它创建和初始化:当它作为函数调用的new注入一个新的Array对象。因此函数调用Array(…)等价于具有相同参数的对象创建表达式new Array(…)

ECMA-262, 3th Edition(与5th Edition相似)。

4

不同之处在于Array函数的实现。不使用新操作符对Array进行调用是否会返回Array的一个实例,取决于实现。例如Mozilla的SpiderMonkey引擎就是这样做的:

static JSBool 
Array(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) 
{ 
    jsuint length; 
    jsval *vector; 

    /* If called without new, replace obj with a new Array object. */ 

这是一个来自实际源的实际评论。下面的代码行不在这里转载。我想其他引擎也会这样做。否则,行为是不确定的。关于这个话题的一个很好的阅读是John Resig的帖子here

5

根据JavaScript权威指南(第5版),602页,“当Array()构造函数作为函数调用,而不new运营商,它的行为完全因为它在与new运营商称为”。

相关问题