date与JavaScript中的新date

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)的String。

和:

Date作为newexpression式的一部分被调用时,它是一个构造函数:它初始化新创build的对象。

因此, new Date(...)返回一个对象,使得obj instanceof Date为true,而Date(...)基本上返回与new Date().toString()

new Date创build一个新的Date对象,您可以使用不同的date修改或初始化Date对象,而Date将返回当前date/时间的string,而忽略其参数。

查看JavaScriptdate以获得快速的API参考和代码testing平台。 你可以看到调用的Date()函数不带new ,不带任何参数,并总是返回当前date/时间的string表示forms。 如果您修改样本为:

 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) 

new Date()返回基于input参数的Date()Date()返回浏览器上的今天的date。

date可让您创build表示date/时间的对象。 这并不意味着被称为一个function。 您可以在这里获得更多信息: date – MDN

Date类可以被称为构造函数方法有一个内置的代码,如:

 function Date(args){ if (this.constructor == Date){ // if you call : new Date(args) }else{ // if you call as method : Date() return new Date() } } 

因此,如果您将它称为方法,则会重新调用构造函数以返回当前的date和时间。

调用一个构造函数是一个明显的错误,它会做(可能)与您的应用程序范围的意想不到的事情,很久之前,你会成为集团bug修复会议的关注焦点。

按照规范的devise者的意图创build一个Date对象,而不是将这些解决scheme编码为工程师认为JS程序员是愚蠢的保护措施。 (在实验室里工作,在谈话中坐在旁边的椅子上,处理了这个问题,然后继续前进)

如果你疯狂地反对新的,你可以尝试object.create,但在写的时候它是慢的,除非你打算实现多态inheritance,那么额外的努力奖励较less。

这是2017年,我有同样的问题。 在阅读之后我发现了一个答案:

“执行显式types转换最简单的方法是使用Boolean(),Number(),String()或Object()函数,我们已经看到这些函数是包装对象的构造函数。运算符,但是,他们作为转换函数和执行types转换..“

“内核类的JavaScript尝试在toString()转换之前尝试valueOf()转换,除了Date类,它执行toString()转换。

所以Date()调用没有新的关键字执行types转换。 由于Date是一个对象,并且对象到原语应该发生,默认情况下,date对象调用toString()(尽pipeDate也有有意义的valueOf()方法)。

发现在“JavaScript:权威指南”一书中。 留在这里为刚刚开始学习JS的后代