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
调用它,它将使用传递的参数初始化自己的内容。如果它作为普通函数调用,它将为您创建一个新数组。