JavaScript中的Date与new Date有什么区别?

85

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)"
8个回答

151

根据规范

当以函数而非构造函数的形式调用 Date 时,它会返回一个表示当前时间(UTC)的字符串。

并且:

当作为 new 表达式的一部分调用 Date 时,它是一个构造函数:它初始化了新创建的对象。

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


2
有没有伪代码可以实现Date()函数既可以作为构造函数,又可以作为普通函数使用?谢谢。 - Benny
4
@Benny 请注意以下内容:function Test(){ var private = "私有值"; this.public = "公有值"; return "返回值"; }调用new Test()将创建一个包含私有和公有值的对象。调用Test()将返回一个字符串。 - musicin3d
@Benny 这是它的实现方式:function Date(/* ... */) { if (!(this instanceof Date)) { return new Date().toString(); } else { /* 我们得到了 new,所以执行构造函数逻辑 */ } - Jo Liss

29

new Date 创建一个新的 Date 对象,您可以修改或使用不同日期初始化它,而 Date 返回当前日期/时间的字符串,忽略其参数。


11

查看JavaScript Date,可以快速获得API参考和代码测试环境。你可以看到不带newDate()函数没有任何参数,并且始终返回当前日期/时间的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)

7
在2017年,我头脑中也有同样的问题。在阅读后,我找到了如下答案: “执行显式类型转换最简单的方法是使用Boolean()、Number()、String()或Object()函数。我们已经看到这些函数作为包装对象的构造函数。然而当它们没有new操作符时,它们作为转换函数工作并执行类型转换。” “核心JavaScript内置类尝试进行valueOf()转换而不是toString()转换,除了Date类,它执行toString()转换。” 因此,未使用new关键字调用Date()会执行一种类型转换。由于Date是一个对象,因此默认情况下应该发生从对象到原始类型的转换,而date对象默认调用toString()(尽管Date还具有有意义的valueOf()方法)。 以上内容摘自《JavaScript权威指南》一书,留在这里供刚开始学习JS的人参考。

3

Date类可以作为构造函数方法调用,它具有内置代码,如下:

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

}

因此,如果您像调用方法一样调用它,它会重新调用构造函数以返回当前日期和时间。

2
有趣的是,但请注意 typeof Date() === 'string',而不是 'object' - Cees Timmerman

3

new Date() 返回基于输入参数的日期,而 Date() 返回浏览器上的今天的日期。


2

Date可以创建代表日期/时间的对象。它不是像函数一样被调用的。你可以在这里获取更多信息: Date - MDN


-3

将构造函数作为函数调用是完全错误的,它会对您的应用范围产生(可能)意想不到的影响,很快你就会成为一个小组错误修复会议的关注焦点。

按照规范设计者的意图创建日期对象,不要编写工程师实现的安全措施的绕过方式,他们认为JS程序员很愚蠢。(在实验室工作时,坐在下一个椅子上参与了这次交谈,解决了问题并继续前进)

如果您非常反对使用 new 操作符,可以尝试 object.create,但目前它的速度较慢,并且除非您计划实现多态继承,否则这也需要额外的努力却得到较少的回报。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接