【问题标题】:What's the difference between Array(1) and new Array(1) in JavaScript?JavaScript 中的 Array(1) 和 new Array(1) 有什么区别?
【发布时间】:2011-08-15 04:22:29
【问题描述】:

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

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

console.log(a, b);

输出是具有一个未定义成员的两个数组。

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

它们之间有什么区别?第一个是否只是显式地实例化对象?

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

【问题讨论】:

  • 我将猛烈抨击它,并说 new 意味着它是一个对象,就像没有 new 的对象一样。带有 new 的将具有此处所述的方法w3schools.com/jsref/jsref_obj_array.asp 而没有 new 的则不会。
  • @Flipper 我遍历了每个属性,它们似乎都有相同的方法。
  • @alex 是的,我刚才做了同样的事情,但没有发现不同之处。我只留下评论而不是答案是有原因的。不过要对这个问题投赞成票!
  • 看起来像调用Array()作为函数也返回一个数组对象,就像调用new Array()一样

标签: javascript


【解决方案1】:

对于Array,两者是等价的。 new 在作为函数调用时被注入:

15.4.1 Array 构造函数作为函数调用

Array 作为函数而不是构造函数调用时,它会创建并初始化一个新的 Array 对象。因此函数调用Array(…) 等价于具有相同参数的对象创建表达式new Array(…)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      区别在于Array函数的实现。在没有 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 的帖子here

      【讨论】:

      • John Resig 的帖子是关于用户定义函数的。没有newArray 的行为由ECMA 规范明确定义,如其他答案中所述。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 2011-11-22
        • 2016-12-03
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多