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

ale*_*lex 38 javascript

我刚刚开始考虑这个问题,但是在jsFiddle乱窜时无法让自己暴露出来.

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

console.log(a, b);
Run Code Online (Sandbox Code Playgroud)

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

做一个for ( in )揭示他们有相同的属性.

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

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

Jon*_*ski 38

Array,两者都是等价的.在new当它作为函数调用注入:

15.4.1 Array构造函数称为函数

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

来自ECMA-262,第3版(与第5版类似).


Sat*_*jit 5

区别在于Array函数的实现。对没有 new 运算符的 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. */
Run Code Online (Sandbox Code Playgroud)

这是来自实际来源的实际评论。下一行代码不在此处复制。我想其他引擎也会这样做。否则行为是未定义的。关于这个主题的一个很好的读物是 John Resig在这里的帖子。


Bri*_*ham 5

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