Javascript 阵列创建,为什么这样做?

Javascript 阵列创建,为什么这样做?,javascript,Javascript,我明白原因: output = new Array(); 及 但这为什么有效呢 output = Array(); 可以编写一个函数,例如Array(),来检测是否在没有new操作符的情况下调用了它,如果省略了new,则自动创建一个新对象,然后返回它。一个函数,例如Array()可以写入以检测是否在没有new操作符的情况下调用它,如果省略了new,则自动创建一个新对象,然后返回它。只需实现Array()构造函数,就不需要使用new调用它。这是它的语义定义的一部分 像Array()这样的内

我明白原因:

 output = new Array();

但这为什么有效呢

 output = Array();

可以编写一个函数,例如
Array()
,来检测是否在没有
new
操作符的情况下调用了它,如果省略了
new
,则自动创建一个新对象,然后返回它。

一个函数,例如
Array()
可以写入以检测是否在没有
new
操作符的情况下调用它,如果省略了
new
,则自动创建一个新对象,然后返回它。

只需实现
Array()
构造函数,就不需要使用
new
调用它。这是它的语义定义的一部分

Array()
这样的内置构造函数(可能)不是用JavaScript编写的,但您可以在自己的代码中获得相同的效果:

function MyConstructor() {
  "use strict";
  var newObj = this || {};

  // ...

  return newObj;
}
当您使用
new
调用时,构造函数将看到它已绑定到
。如果没有,则
将是未定义的(因为“使用严格”;您也可以检查
是否为全局对象,这是旧IE必须执行的操作)

构造函数的返回值不是
new
表达式的值-它始终是新创建的对象。但是,当您在不使用
new
的情况下调用它时,将使用返回值

edit-RobG在一篇评论中指出,为了让它真正正常工作,函数创建的“合成”
newObj
需要显式设置,以便它具有适当的原型等。这有点棘手;代码可以简单地执行以下操作:

function MyConstructor() {
  "use strict";
  if (!this) return new MyConstructor();
  // ... or possibly using "apply" if you need parameters too
}
T.J.Crowder在这里写了一些关于对象/继承争论的精彩答案。

数组()构造函数的实现非常简单,因此不需要使用
new
调用它。这是它的语义定义的一部分

Array()
这样的内置构造函数(可能)不是用JavaScript编写的,但您可以在自己的代码中获得相同的效果:

function MyConstructor() {
  "use strict";
  var newObj = this || {};

  // ...

  return newObj;
}
当您使用
new
调用时,构造函数将看到它已绑定到
。如果没有,则
将是未定义的(因为“使用严格”;您也可以检查
是否为全局对象,这是旧IE必须执行的操作)

构造函数的返回值不是
new
表达式的值-它始终是新创建的对象。但是,当您在不使用
new
的情况下调用它时,将使用返回值

edit-RobG在一篇评论中指出,为了让它真正正常工作,函数创建的“合成”
newObj
需要显式设置,以便它具有适当的原型等。这有点棘手;代码可以简单地执行以下操作:

function MyConstructor() {
  "use strict";
  if (!this) return new MyConstructor();
  // ... or possibly using "apply" if you need parameters too
}
T.J.Crowder在这里就对象/继承之争写了一些令人敬畏的答案。

微不足道的答案是“因为ECMA-262这么说”。RTFM

第一个调用,第二个调用(也称为数组文字)

第三个是调用and,相当于
newarray()
[]

简单的回答是“因为ECMA-262这么说”。RTFM

第一个调用,第二个调用(也称为数组文字)

第三个是调用and,相当于
newarray()
[]

输出=数组(),因为数组是一个函数

运行此代码3

<script>
var a = new Array();
var b = Array();
a[0] = 123;
b[0] = 32;
alert("a = " + a +"\nb = " +b +", " + Array);
</script>
因此,由于Array是一个函数,您可以调用Array(),它的实现是返回一个新的Array()

output=Array(),因为Array是一个函数

运行此代码3

<script>
var a = new Array();
var b = Array();
a[0] = 123;
b[0] = 32;
alert("a = " + a +"\nb = " +b +", " + Array);
</script>

因此,由于Array是一个函数,您可以调用Array(),它的实现是返回一个新的Array()

我认为这是不对的。如果未使用
new
调用
MyConstructor
newObj
将不会从中继承。该函数需要返回MyConstructor的实例(并非所有浏览器或用户代理都支持严格模式)。@RobG yes抱歉;你当然是对的。为了简单起见,我省略了这一部分,但我想明确地说:——)我认为这是不对的。如果未使用
new
调用
MyConstructor
newObj
将不会从中继承。该函数需要返回MyConstructor的实例(并非所有浏览器或用户代理都支持严格模式)。@RobG yes抱歉;你当然是对的。为了简单起见,我省略了这一部分,但我的意思是明确地说:——)