什么时候*不*在内置插件上使用新作品? [复制]
Posted
技术标签:
【中文标题】什么时候*不*在内置插件上使用新作品? [复制]【英文标题】:When does *not* using new work on built-ins? [duplicate] 【发布时间】:2014-07-26 14:36:06 【问题描述】:在使用内置 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
非新构造函数内置函数的行为是否在 ECMAScript 规范中的任何地方定义?请注意,这种行为实际上很有用;我可以通过调用 Array.apply(arr)
来制作数组的非稀疏副本,但只有在跨平台时我才会觉得这样做很舒服。
【问题讨论】:
另一个类似答案的相关问题:***.com/questions/1978049/… 注:Date() === new Date().toString()
What's the difference between Array(1) and new Array(1) in JavaScript?
Date 的行为在文档中 -> "Note that JavaScript Date objects can only be instantiated by calling JavaScript Date as a constructor: calling it as a regular function (i.e. without the new operator) will return a string rather than a Date object; unlike other JavaScript object types, JavaScript Date objects have no literal syntax."
对于 Array 则不同,即使在没有 new 关键字的情况下调用它也会返回一个新实例,因此它取决于您使用的本机方法。
【参考方案1】:
是的,ECMA-262(我使用 5.1 版作为参考)确实定义了在使用或不使用 new
关键字调用时对象构造函数的行为方式。
对于Array
:
15.4.1 The Array Constructor Called as a Function:
当
Array
作为函数而不是构造函数调用时,它会创建并初始化一个新的 Array 对象。因此函数调用Array(…)
等价于具有相同参数的对象创建表达式new Array(…)
。
15.4.2 The Array Constructor:
当
Array
作为new
表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
对于Date
:
15.9.2 The Date Constructor Called as a Function:
当
Date
作为函数而不是构造函数调用时,它会返回一个表示当前时间 (UTC) 的字符串。 函数调用Date(…)
不等同于具有相同参数的对象创建表达式new Date(…)
。
15.9.3 The Date Constructor:
当
Date
作为新表达式的一部分被调用时,它是一个构造函数:它初始化新创建的对象。
【讨论】:
【参考方案2】:本机方法的行为取决于 EcmaScript 规范。
对于Date
the spec 说:
当 Date 作为函数而不是构造函数调用时,它 返回一个表示当前时间 (UTC) 的字符串。
注意:函数调用 Date(...) 不等同于与具有相同参数的对象创建表达式 new Date(...)。
对于Array
spec says
当 Array 作为函数而不是构造函数调用时,它 创建并初始化一个新的 Array 对象。
因此函数调用 Array(...) 等价于 对象创建表达式 new Array(...) 具有相同的论点。
因此,无论是否使用 new
关键字,它的工作方式完全取决于您使用的方法,以及在没有 new 关键字的情况下调用规范时应该发生的情况。
例如,Math 对象又不同了
Math 对象没有 [[Construct]] 内部属性;它是 不能将 Math 对象用作带有 new 的构造函数 运算符。
【讨论】:
如果您可以将所有内置函数的行为添加为函数与构造函数(没有那么多),那就太好了。对规范的引用非常好。 @user3629476 - 嗯,有日期、数组、对象、字符串、数字、布尔值、数学、正则表达式等。有很多,规范说明了一切,我不确定是否复制每个内置的规范会使答案更好吗? 更不用说你必须更新他对 ES6、ES7 等的回答。以上是关于什么时候*不*在内置插件上使用新作品? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
我把u盘左系统盘装机,然后复制文件的时候一直复制不上,我就拔插拔插,然后他现在插上去,系统提示插入