你为什么要在没有括号的情况下调用新的日期?

时间:2014-01-13 19:44:33

标签: javascript datetime constructor

我在Gmail中意外打开开发工具时看到了这个片段:

var GM_TIMING_END_CHUNK1=(new Date).getTime();

我通常会期待这样的事情,因为调用没有括号的构造函数是相当罕见的(至少我从未见过它):

var GM_TIMING_END_CHUNK1=new Date().getTime();

var GM_TIMING_END_CHUNK1=Date.now(); //newer browsers

这样做有什么好处,行为有什么不同吗?这是完全相同的字符数量,所以简洁不是一个原因。

5 个答案:

答案 0 :(得分:19)

如果没有传递参数,你可以在JS中调用带有括号的JS中的构造函数,效果是相同的。

new Date()new Date相同。

但是,当您想在结果对象上调用方法时,它会有所不同:

new Date().getTime()有效,但new Date.getTime()不会,因为在后一种情况下,解释器假定getTime是Date 类型的方法,但这不是真的,{ {1}}是一个实例方法 - 仅存在于构造对象中。为了克服这个问题,你可以在构造函数调用周围包括括号,告诉解释器它是一个表达式:

getTime

首先评估表达式,并在结果上调用(new Date).getTime(),结果是Date的实例。

答案 1 :(得分:5)

除了有关可选括号的现有注释 - 即new Date() <==> new Date - 另请注意Date.now是一种静态方法。也就是说,没有Date对象被实例化。该方法是Date构造函数本身的属性。这样,它与其他两个例子不同。

作为一种风格问题,我更喜欢包括所有可选的parens以保持一致性和清晰度:

(new Date()).getTime()

答案 2 :(得分:2)

当函数用作对象构造函数且没有传递参数时,括号是可选的。 d = new Date;d = new Date();的含义相同。

答案 3 :(得分:1)

两个语句没有区别,括号是可选的,所以程序员通常会删除它。

在你的第二个例子中:

new Date().getTime();

一个优秀的实践程序员遵循在调用函数或属性之前将对象括在括号中。所以它将是:

(new Date()).getTime();

如上所述,对象括号是可选的。所以更简洁的清洁代码是:

(new Date).getTime();

答案 4 :(得分:0)

您可能想看一下这个答案: Can we omit parentheses when creating an object using the "new" operator?

基本new Date与编写new Date()无关,尽管您可能更喜欢使用new Date()来保持一致性,因为函数和构造函数在JavaScript中非常相似,而且括号中的语法绝对是非法的用于函数调用。