我刚刚开始考虑这个问题,但是在jsFiddle中徘徊时,却无法让自己暴露出来。
var a = new Array(1),
b = Array(1);
console.log(a, b);
输出是两个具有一个未定义成员的数组。
执行for ( in )
会显示它们具有相同的属性。
这些之间有什么区别?第一个是否只是显式地实例化对象?
请不要告诉我使用数组文字表示法,因为我已经知道了。我希望在上面解释的知识中填补这个空白。
答案 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;
}