函数返回数组的Javascript`new`关键字

时间:2011-06-27 09:39:26

标签: javascript arrays function new-operator

我正在尝试使用new关键字,但我无法找到此行为的解释。 假设我们有一个函数返回一个整数:

(在萤火虫中)

>>> function x() { return 2; }
>>> x()
2
>>> new x()
x { }

但是如果函数返回一个数组:

>>> function y() { return [2]; }
>>> y()
[2]
>>> new y()
[2]

为什么?

2 个答案:

答案 0 :(得分:16)

new运算符有一个有趣的行为:它返回运算符创建的对象,除非构造函数返回不同的对象。忽略构造函数的任何非对象返回值,这就是当您返回2时没有看到此内容的原因。

当您说new x()

时会发生什么
  1. 解释器会创建一个新的空白对象。
  2. 它将对象的基础原型设置为x.prototype
  3. 调用x并将this设置为新对象。
  4. 在正常情况下,x不返回任何内容,new表达式的结果是在步骤1中创建的新对象。但是,如果{{ 1}}返回非x 对象引用,然后该对象引用是null表达式的结果,而不是在步骤1中创建的对象。任何其他类型的返回值(new,原始数字,原始字符串,null等)被忽略;它必须是非undefined对象引用,才能优先于创建的对象null
  5. new运算符对对象引用的这种特殊处理允许您将另一个对象替换为创建的new对象。这在某些有限的情况下可以很方便,但浩大大部分时间,设计用于new的函数(称为构造函数)什么都没有。

    对于某些轻读(hah!),这由规范的Section 13.2.2“[[Construct]]”)涵盖(HTML; {{3 } {},由PDF引用(new运算符”)。

答案 1 :(得分:5)

因为数组是一个对象,但2不是。

如果使用new关键字调用函数,则必须返回一个对象。如果您没有明确地这样做,它会自动返回this(这是一个继承自funcName.prototype)的空对象。