繁体   English   中英

JavaScript 中的 Array(1) 和 new Array(1) 有什么区别?

[英]What's the difference between Array(1) and new Array(1) in JavaScript?

我刚刚开始考虑这个问题,但是在jsFiddle 乱搞时无法暴露自己的任何差异。

var a = new Array(1),
    b = Array(1);

console.log(a, b);

Output 是两个 arrays 和一个未定义的成员。

执行for ( in )表明它们具有相同的属性。

这些之间有什么区别? 第一个是否只是显式地实例化 object ?

请不要教我如何使用数组文字符号,因为我已经知道了。 我更希望填补上面解释的我的知识空白。

使用Array ,两者都是等价的。 new的被称为 function 时被注入:

15.4.1 称为 Function 的Array构造函数

Array被称为 function 而不是构造函数时,它会创建并初始化一个新的 Array object。 因此,function 调用Array(…)等价于 object 创建表达式new Array(…)与相同的 arguments。

来自ECMA-262,第 3 版(与第 5 版类似)。 另请参阅 ECMA-262 ECMAScript 2020 规范(第 11 版)中的22.1.1 The Array Constructor

根据 Javascript:权威指南(第 5 版),第 602 页,“当Array()构造函数作为 function 调用时,没有new运算符,它的行为与使用new运算符调用时完全相同。”

不同之处在于 Array function 的实现。 在没有 new 运算符的情况下调用 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帖子。

new创建一个新的 object (类实例),它作为this传递给构造函数 function 。 但是有些函数会检测它们是否没有使用new调用,并且行为方式与它们相同。 Array就是其中之一,所以没有任何区别。

如果你想自己创建这样的构造函数,你可以像下面的代码那样做:

function Smth(val) {
  if (!(this instanceof Smth)) {
    return new Smth(val);
  }

  this.val = val;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM