什么时候不*使用新的工作
这个问题在这里已经有了答案:
本地方法的行为取决于EcmaScript规范。
对于Date
规格说:
当Date被作为函数而不是构造函数调用时,它会返回一个表示当前时间(UTC)的String。
注:函数调用Date(...)与具有相同参数的对象创建表达式new Date(...) 不等效 。
规范说,对Array
当数组被调用为函数而不是构造函数时,它会创建并初始化一个新的数组对象。
因此,函数调用Array(...) 等价于具有相同参数的对象创建表达式new Array(...)。
因此,如何使用或不使用new
关键字完全取决于您使用的是什么方法,以及在没有新关键字的情况下调用时应该发生的内容。
例如,Math对象又是不同的
Math对象没有[[Construct]]内部属性; 无法将Math对象用作new运算符的构造函数。
是的,ECMA-262(我正在使用5.1版作为参考)确实定义了在使用或不使用new
关键字调用对象构造函数时应如何表现。
对于Array
:
15.4.1作为函数调用的数组构造函数:
当Array
被调用为函数而不是构造函数时,它会创建并初始化一个新的数组对象。 因此,函数调用Array(…)
等价于具有相同参数的对象创建表达式new Array(…)
。
15.4.2数组构造器:
当Array
作为new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
对于Date
:
15.9.2作为函数调用的Date构造函数:
当Date
被作为函数而不是构造函数调用时,它会返回一个表示当前时间(UTC)的String。
函数调用Date(…)
new Date(…)
与具有相同参数的对象创建表达式new Date(…)
不等效。
15.9.3 Date构造函数:
Date
作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。