数组创建,为什么这个工作?

时间:2012-11-19 22:52:59

标签: javascript

我理解为什么:

 output = new Array();

 output = [];

但为什么会这样呢?

 output = Array();

4 个答案:

答案 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()