我明白为什么:
output = new Array();
和
output = [];
但为什么这行得通?
output = Array();
构造函数的实现很简单,因此不需要Array()
调用它。new
这是其语义定义的一部分。
像这样的内置构造函数Array()
(可能)不是用 JavaScript 编写的,但您可以在自己的代码中获得相同的效果:
function MyConstructor() {
"use strict";
var newObj = this || {};
// ...
return newObj;
}
当你调用 withnew
时,构造函数会看到它绑定了一些东西this
。如果您不这样做,那么this
将是未定义的(因为“使用严格”;您也可以检查是否this
是全局对象,对于旧 IE,您必须这样做)。
构造函数的返回值不是new
表达式的值——它总是新创建的对象。但是,当您在没有 的情况下调用它new
时,将使用返回值。
编辑——RobG 在评论中指出,要使其真正正常工作,newObj
需要明确设置函数创建的“合成”,以便获得正确的原型等。这有点棘手;代码简单地执行此操作可能是最简单的:
function MyConstructor() {
"use strict";
if (!this) return new MyConstructor();
// ... or possibly using "apply" if you need parameters too
}
TJ Crowder 在这里就对象/继承争论的主题写了一些很棒的答案。
Array()
可以编写一个函数来检测它是否在没有new
运算符的情况下被调用,如果new
被省略,则会自动创建一个新对象然后返回它。
简单的答案是“因为 ECMA-262 这么说”。实时调频。
第一个调用Array 函数作为构造函数,第二个是Array 初始化器(又名 Array 字面量)。
第三种是将Array函数作为函数调用,等价于new Array()
and []
。
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(),它的实现就是给你一个 new Array()