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

sla*_*ppy 6 javascript arrays function new-operator

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

(在萤火虫中)

>>> function x() { return 2; }
>>> x()
2
>>> new x()
x { }
Run Code Online (Sandbox Code Playgroud)

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

>>> function y() { return [2]; }
>>> y()
[2]
>>> new y()
[2]
Run Code Online (Sandbox Code Playgroud)

这是为什么 ?

T.J*_*der 16

new运营商有一个有趣的现象:除非构造函数返回一个不同的对象,它返回由运营商创建的对象.忽略构造函数的任何非对象返回值,这就是为什么当你返回时你2看不到这一点.

这是当你说new x():

  1. 解释器创建一个新的空白对象.
  2. 它将对象的底层原型设置为x.prototype.
  3. x使用thisset 调用新对象.
  4. 在正常情况下,x不返回任何内容,new表达式的结果是在步骤1中创建的新对象.但是,如果x返回非null 对象引用,则该对象引用是new表达式的结果而不是创建的对象在步骤1中,忽略任何其他类型的返回值(null原始数字,原始字符串undefined等); 它必须是非null对象引用才能优先于new创建的对象.

new操作员对对象引用的这种特殊处理允许您将不同的对象替换为new创建的对象.这在某些有限的情况下可以很方便,但绝大多数情况下,设计用于new(称为构造函数)的函数不应返回任何内容.

对于某些轻读(hah!),这由规范(HTML ; PDF)的第13.2.2节("[[Construct]]")涵盖,该第11.2.2节(" 运算符")引用.new


Fel*_*ing 5

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

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