JavaScript中的Array(1)和新的Array(1)有什么区别?

时间:2011-04-29 01:43:57

标签: javascript

我刚刚开始考虑这个问题,但是在jsFiddle中徘徊时,却无法让自己暴露出来。

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

console.log(a, b);

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

执行for ( in )会显示它们具有相同的属性。

这些之间有什么区别?第一个是否只是显式地实例化对象?

请不要告诉我使用数组文字表示法,因为我已经知道了。我希望在上面解释的知识中填补这个空白。

4 个答案:

答案 0 :(得分:34)

使用Array,两者都是等效的。 new在被称为函数时被注入:

  

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

     

Array作为函数而不是构造函数调用时,它会创建并初始化一个新的Array对象。因此,函数调用Array(…)等同于具有相同参数的对象创建表达式new Array(…)

来自ECMA-262, 3th Edition(与5th Edition中类似)。

答案 1 :(得分:5)

根据Javascript:The Definitive Guide(第5版),第602页,“当Array()构造函数作为函数调用时,如果没有new运算符,它的行为与调用时的行为完全相同使用new运算符。“

答案 2 :(得分:3)

不同之处在于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

答案 3 :(得分:1)

new 创建一个新对象(类实例),它作为 this 传递给构造函数。但是有些函数会检测它们是否不是使用 new 调用的,并且其行为方式与调用时相同。 Array 就是其中之一,所以没有任何区别。

如果你想自己创建这样的构造函数,你可以像下面的代码那样做:

function Smth(val) {
  if (!(this instanceof Smth)) {
    return new Smth(val);
  }

  this.val = val;
}