【问题标题】:Why would you invoke new Date without parentheses? [duplicate]为什么要调用不带括号的新日期? [复制]
【发布时间】:2014-02-01 17:06:53
【问题描述】:

我刚刚在 Gmail 中打开开发工具时看到了这个 sn-p:

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

这样做有什么好处,行为有什么不同吗?所需的字符数量完全相同,因此简洁不是理由。

【问题讨论】:

  • 如果您想将日期作为对象,var d = new Date; 怎么样?这样可以节省两个字符。也许这样做是为了让 C++ 程序员更容易熟悉,其中默认构造函数不使用括号调用所谓的“最令人烦恼的解析”(至少从历史上看;我不知道这种行为在最近的版本中是否发生了变化C++ 标准)。

标签: javascript datetime constructor


【解决方案1】:

如果不传入任何参数,可以在JS中不带括号调用构造函数,效果是一样的。

new Date()new Date 相同。

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

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

(new Date).getTime()

这种方式首先计算表达式,然后在作为 Date 实例的结果上调用 getTime

【讨论】:

    【解决方案2】:

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

    就风格而言,我更喜欢包含所有可选的括号以保持一致性和清晰性:

    (new Date()).getTime()
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好的,这看起来很合理,谢谢。那么,这种做法如此罕见有什么原因吗?
      • @m90 我会说这并不常见,因为它会损害可读性并且仅在您不想传递任何参数时才有效。
      • 这种情况并不常见,因为它会混淆像您这样的人。 :) 在诸如 Ruby 之类的语言中,您可以在其他上下文中调用不带括号的方法或函数,而不仅仅是构造,但在 Javascript 中这是一种特殊情况,大多数程序员可能甚至不会尝试它。
      【解决方案4】:

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

      在你的第二个例子中:

      new Date().getTime();
      

      在调用函数或属性之前,程序员遵循将对象包装在括号中的一种良好做法。所以它会是:

      (new Date()).getTime();
      

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

      (new Date).getTime();
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-17
          • 2015-11-01
          • 2017-09-08
          • 2021-09-19
          • 2014-08-09
          相关资源
          最近更新 更多