代码之家  ›  专栏  ›  技术社区  ›  Homunculus Reticulli

Javascript“new”关键字似乎被忽略-这是“edge case”吗?

  •  0
  • Homunculus Reticulli  · 技术社区  · 4 年前

    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)"
    
    0 回复  |  直到 9 年前
        1
  •  134
  •   pimvdb    14 年前

    specs :

    什么时候 Date 作为函数而不是构造函数调用,它返回表示当前时间(UTC)的字符串。

    以及:

    什么时候 日期 被称为 new 表达式,它是一个构造函数:它初始化新创建的对象。

    所以 new Date(...) 返回一个对象,以便 obj instanceof Date 是真的,但是 Date(...) 基本上返回与相同的 new Date().toString()

        2
  •  27
  •   user1252065 user1252065    14 年前

    new Date 创建新的日期对象,您可以在 Date 返回当前日期/时间的字符串,忽略其参数。

        3
  •  10
  •   nkron    14 年前

    退房 JavaScript Date 用于快速API参考和代码测试平台。您可以看到 Date() 调用函数时没有 new 不接受任何参数并始终返回 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)
    
        4
  •  7
  •   pollx    9 年前

    2017年,我也有同样的问题。阅读后,我找到了一个答案:

    执行显式类型转换的最简单方法是使用Boolean()、Number()、String()或Object()函数。我们已经将这些函数视为包装对象的构造函数。但是,在没有新运算符的情况下调用时,它们将作为转换函数并执行类型转换

    “核心JavaScript的内置类尝试 toString()转换之前的valueOf()转换,Date类除外, 它执行toString()转换。“”

    因此,在不使用new关键字的情况下调用Date()会执行类型转换。由于Date是一个对象,并且应该发生原语的对象,Date对象在默认情况下调用了字符串()(尽管Date也有有有意义的valueOf()方法)。

    在《JavaScript:权威指南》一书中发现了这一点。把它留给刚刚开始学习JS的后代:)

        5
  •  3
  •   PraveenVenu    14 年前

    new Date() 根据输入参数和返回日期 Date() 在浏览器上返回今天的日期。

        6
  •  3
  •   Abdennour TOUMI    11 年前

    Date 类可以称为 建造师 或作为 方法 要具有内置代码,请执行以下操作:

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

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

        7
  •  2
  •   mav    14 年前

    日期用于创建表示日期/时间的对象。它不应该像函数一样被调用。您可以在此处获得更多信息: Date - MDN

        8
  •  -3
  •   S.Munkhey    11 年前

    将构造函数作为函数调用是完全错误的,它会(可能)对你的应用程序范围产生意想不到的影响,很快你就会成为群bug修复会话的焦点。

    按照规范设计者的意图创建一个日期对象,不要对那些认为JS程序员愚蠢的工程师实施的作为保护措施的变通方法进行编码。(在实验室工作,在谈话中坐在旁边的椅子上,处理了它,然后继续前进)

    如果你疯狂地反对新事物,你可以试试object。创建,但在编写时速度较慢,除非您计划实现多态继承,否则这是额外的努力,回报较少。