Javascript '的行为;返回';和';新';在构造函数中

Javascript '的行为;返回';和';新';在构造函数中,javascript,object,Javascript,Object,我想知道这两个电话有什么区别: var a = Array(1,2,3); var b = new Array(1,2,3); 我试图以这种方式模仿这种行为: function test() { return {x:42}; } var a = test(); var b = new test(); console.log(a,b); // the same 为什么b与a相同?如果使用了new,则应忽略返回值: function test() { return 1; } var

我想知道这两个电话有什么区别:

var a = Array(1,2,3);
var b = new Array(1,2,3);
我试图以这种方式模仿这种行为:

function test() {
  return {x:42};
}

var a = test();
var b = new test();
console.log(a,b); // the same
为什么
b
a
相同?如果使用了
new
,则应忽略返回值:

function test() {
  return 1;
}

var a = test();
var b = new test();
console.log(a,b); // 1 test{}

使用
new
调用函数时,将创建一个新对象,并将其作为
this
传递到函数中。如果函数不返回任何内容(或返回原语),则传入的新对象是
new
表达式的结果但是,如果函数返回一个对象,则创建的新对象将被丢弃,而函数返回的对象是
表达式的结果。这一点在本规范的第1部分中有详细介绍。它主要适用于不可变对象,在这些对象中,构造函数维护某种缓存,并在参数相同(当然是单例)的情况下重用实例

因此,在您的示例中,由于
test
函数返回一个对象,因此通过
new
调用它只是创建并丢弃
new
操作符创建的对象,结果是从
test
返回的对象

如果返回不同的对象,我可能不应该说
new
中的对象必然被“丢弃”。构造函数可能会对
new
中的对象执行某些操作,以防止它被丢弃。例如,您可以编写如下构造函数:

function WeirdConstructor() {
    return {
        theNewObject: this
    };
}
…它接受由
new
创建的对象,并使其成为返回对象的属性。说这是一种特殊情况,可以说是温和的。:-)

Array(1,2,3)
newarray(1,2,3)
都返回一个新数组,这一事实实际上只是
Array
构造函数的一个特殊特性。如果您不通过
new
调用每个标准构造函数,规范会仔细地列出它们的功能。行为各不相同。他们中的许多人做类型强制,像
Array
这样的夫妇就像你用过
new
,尽管你没有,而且
Date
做了一件非常奇怪的事情(给你当前日期的字符串版本,基本上是
string(new Date())



特别是关于
数组
:我不会使用
数组(1,2,3)
新数组(1,2,3)
。我会使用
[1,2,3]
。这并不含糊(新数组(3)是否创建了长度为3的空白数组,或者其中有一个条目3的数组?新数组(3)如何?),有人可能(尽管不太可能)对符号
数组进行阴影处理,但他们不能对文字形式进行阴影处理。但我不认为这是你问题的重点。:-)

把我吹走!该标准是否有文件证明?JanTuroň:是的,第11.2.2节。
Array
可能在内部执行与此类似的检查:。如果使用
new
调用它,它将使用传递的参数初始化自己的内容。如果它作为普通函数调用,它将为您创建一个新数组。