new Date()
需要一个序数,然后返回一个Date
对象。
Date()
是什么功能?为何它提供了不同的时间?
>>> new Date(1329429600000)
Date {Fri Feb 17 2012 00:00:00 GMT+0200 (القدس Standard Time)}
>>> Date(1329429600000)
"Tue Mar 06 2012 15:29:58 GMT+0200 (Jerusalem Standard Time)"
new Date()
需要一个序数,然后返回一个Date
对象。
Date()
是什么功能?为何它提供了不同的时间?
>>> new Date(1329429600000)
Date {Fri Feb 17 2012 00:00:00 GMT+0200 (القدس Standard Time)}
>>> Date(1329429600000)
"Tue Mar 06 2012 15:29:58 GMT+0200 (Jerusalem Standard Time)"
根据规范:
当以函数而非构造函数的形式调用
Date
时,它会返回一个表示当前时间(UTC)的字符串。
并且:
当作为
new
表达式的一部分调用Date
时,它是一个构造函数:它初始化了新创建的对象。
因此,new Date(...)
返回一个对象,使得 obj instanceof Date
为 true,而 Date(...)
基本上与 new Date().toString()
返回相同。
new Date
创建一个新的 Date 对象,您可以修改或使用不同日期初始化它,而 Date
返回当前日期/时间的字符串,忽略其参数。
查看JavaScript Date,可以快速获得API参考和代码测试环境。你可以看到不带new
的Date()
函数没有任何参数,并且始终返回当前日期/时间的string
表示。如果要修改示例为:
console.log(Date());
console.log(Date(1329429600000));
你会发现两者的结果相同(因为 JavaScript 忽略传递给函数的额外参数):
Wed Apr 11 2012 09:58:11 GMT-0700 (PDT)
Wed Apr 11 2012 09:58:11 GMT-0700 (PDT)
Date
类可以作为构造函数或方法调用,它具有内置代码,如下:
function Date(args){
if (this.constructor == Date){
// if you call : new Date(args)
}else{
// if you call as method : Date()
return new Date()
}
}
typeof Date() === 'string'
,而不是 'object'
。 - Cees Timmermannew Date()
返回基于输入参数的日期,而 Date()
返回浏览器上的今天的日期。
将构造函数作为函数调用是完全错误的,它会对您的应用范围产生(可能)意想不到的影响,很快你就会成为一个小组错误修复会议的关注焦点。
按照规范设计者的意图创建日期对象,不要编写工程师实现的安全措施的绕过方式,他们认为JS程序员很愚蠢。(在实验室工作时,坐在下一个椅子上参与了这次交谈,解决了问题并继续前进)
如果您非常反对使用 new 操作符,可以尝试 object.create,但目前它的速度较慢,并且除非您计划实现多态继承,否则这也需要额外的努力却得到较少的回报。
function Test(){ var private = "私有值"; this.public = "公有值"; return "返回值"; }
调用new Test()
将创建一个包含私有和公有值的对象。调用Test()
将返回一个字符串。 - musicin3dfunction Date(/* ... */) { if (!(this instanceof Date)) { return new Date().toString(); } else { /* 我们得到了
new,所以执行构造函数逻辑 */ }
- Jo Liss