Javascript 什么时候*不*使用内置的新工作?
在使用内置JavaScript对象和构造函数时,我注意到有点奇怪 有时,可以通过调用构造函数而不使用Javascript 什么时候*不*使用内置的新工作?,javascript,standards,Javascript,Standards,在使用内置JavaScript对象和构造函数时,我注意到有点奇怪 有时,可以通过调用构造函数而不使用new来获取新对象。例如: > new Array(1,2,3,4) [1, 2, 3, 4] > Array(1,2,3,4) [1, 2, 3, 4] 但有时这不起作用: > Date() "Thu Jun 05 2014 00:28:10 GMT-0600 (CST)" > new Date() Date 2014-06-05T06:28:10.876Z ECMA
new
来获取新对象。例如:
> new Array(1,2,3,4)
[1, 2, 3, 4]
> Array(1,2,3,4)
[1, 2, 3, 4]
但有时这不起作用:
> Date()
"Thu Jun 05 2014 00:28:10 GMT-0600 (CST)"
> new Date()
Date 2014-06-05T06:28:10.876Z
ECMAScript规范中是否定义了非新构造函数内置函数的行为?注意,这种行为实际上是有用的;我可以通过调用
array.apply(arr)
来创建数组的非稀疏副本,但只有在跨平台的情况下,我才会觉得这样做很舒服。本机方法的行为取决于EcmaScript规范
对于日期
来说:
当Date作为函数而不是构造函数调用时,它
返回表示当前时间(UTC)的字符串
注意:函数调用日期(…)与具有相同参数的对象创建表达式new Date(…)不等效
对于数组
当数组作为函数而不是构造函数调用时,它
创建并初始化新的数组对象
因此函数调用
数组(…)等同于对象创建表达式new Array(…)
用同样的论点
因此,它在使用或不使用new
关键字的情况下如何工作完全取决于您使用的方法,以及在不使用new关键字的情况下调用规范时会发生什么
例如,数学对象再次不同
数学对象没有[[Construction]]内部属性;它是
无法将Math对象用作具有新
接线员
是的,(我使用5.1版作为参考)确实定义了在使用或不使用new
关键字调用对象构造函数时,对象构造函数的行为
对于阵列
:
:
当Array
作为函数而不是构造函数调用时,它会创建并初始化一个新的数组对象。因此,函数调用Array(…)
相当于具有相同参数的对象创建表达式newarray(…)
:
当Array
作为new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象
对于日期:
:
当Date
作为函数而不是构造函数调用时,它返回一个表示当前时间(UTC)的字符串。函数调用
Date(…)
与具有相同参数的对象创建表达式new Date(…)
不同
:
当Date
作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象
另一个回答类似的相关问题:注意:
Date()==new Date().toString()
的行为在文档中->“注意,JavaScript日期对象只能通过调用JavaScript日期作为构造函数来实例化:将其作为常规函数调用(即不使用新操作符)将返回字符串而不是日期对象;与其他JavaScript对象类型不同,JavaScript日期对象没有文字语法。”
对于数组,它不同,即使在调用时没有new关键字,它也会返回一个新实例,因此,这取决于您使用的本机方法。如果您可以将所有内置函数的行为添加为函数与构造函数(没有那么多),那就太好了。对规范的引用非常好。@user3629476-有日期、数组、对象、字符串、数字、布尔值、数学、RegExp等。有很多,规范说明了一切,我不确定复制每个内置的规范是否会使答案更好?更不用说,你必须更新ES6、ES7等的答案。