我理解为什么:
output = new Array();
和
output = [];
但为什么会这样呢?
output = Array();
答案 0 :(得分:3)
简单地实现了Array()
构造函数,因此不需要使用new
调用它。它是语义定义的一部分。
像Array()
这样的内置构造函数(可能)不是用JavaScript编写的,但是你可以在自己的代码中获得相同的效果:
function MyConstructor() {
"use strict";
var newObj = this || {};
// ...
return newObj;
}
当您使用new
进行调用时,构造函数将会看到它已绑定到this
。如果你不这样做,那么this
将是未定义的(因为“use strict”;你可以检查this
是否是全局对象,你必须为旧的IE做)。
构造函数的返回值不是new
表达式的值 - 它始终是新创建的对象。但是,当您在没有new
的情况下调用它时,将使用返回值。
编辑 - RobG在评论中指出,为了使其真正正常工作,需要明确设置函数创建的“合成”newObj
,以便它得到适当的原型等。这有点棘手;代码简单地执行此操作可能是最简单的:
function MyConstructor() {
"use strict";
if (!this) return new MyConstructor();
// ... or possibly using "apply" if you need parameters too
}
T.J。关于对象/继承争论的主题,克劳德在这里写了一些很棒的答案。
答案 1 :(得分:1)
可以编写Array()
之类的函数来检测是否在没有new
运算符的情况下调用它,如果省略new
则自动创建一个新对象然后返回它。
答案 2 :(得分:0)
琐碎的答案是“因为ECMA-262这么说”。 RTFM。
第一个调用Array function as a constructor,第二个调用Array initialiser(又名数组文字)。
第三个是调用Array function as a function,相当于new Array()
和[]
。
答案 3 :(得分:0)
output = Array()有效,因为Array是一个函数。
运行此cod3
<script>
var a = new Array();
var b = Array();
a[0] = 123;
b[0] = 32;
alert("a = " + a +"\nb = " +b +", " + Array);
</script>
打印出来:
a = 123
b = 32, function Array() {
[native code]
}
因此,由于Array是一个函数,你可以调用Array(),它的实现是为了给你一个新的Array()