关于javascript:为什么你会在没有括号的情况下调用新的日期?

Why would you invoke new Date without parentheses?

本问题已经有最佳答案,请猛点这里访问。

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

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

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

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

要么

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

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


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

new Date() vs new Date相同。

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

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

(new Date).getTime()

这样首先评估表达式,并在结果上调用getTime,结果是Date的实例。


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

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

1
(new Date()).getTime()


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


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

在你的第二个例子中:

1
new Date().getTime();

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

1
(new Date()).getTime();

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

1
(new Date).getTime();

你可能想看看这个答案:
使用"new"运算符创建对象时,我们可以省略括号吗?

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