JavaScript中的日期与新日期

JavaScript中的日期与新日期,javascript,Javascript,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)" new

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)"

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

来自:

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

以及:

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


因此,
new Date(…)
返回一个对象,使得
obj instanceof Date
为true,而
Date(…)
基本上返回与
new Date()相同的值。toString()
new Date()
基于输入参数和
Date()返回日期
在浏览器上返回今天的日期。

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

查看API快速参考和代码测试平台。您可以看到在不使用
new
的情况下调用的
Date()
函数不接受任何参数,并且总是返回当前日期/时间的
字符串表示形式。如果将样本修改为:

console.log(Date());
console.log(Date(1329429600000));
您会发现两者的结果相同(因为JavaScript忽略传递给函数的额外参数):


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

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


如果您非常反对新的,您可以尝试object.create,但在编写时速度较慢,除非您计划实现多态继承,否则这是额外的努力,回报较少。

Date
类可以称为构造函数方法来拥有内置代码,如:

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

}

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

现在是2017年,我心里也有同样的问题。读了一些书后,我找到了一个答案:

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

核心JavaScript的内置类 toString()转换之前的valueOf()转换,日期类除外, 它执行toString()转换。“

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


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

有没有关于Date()函数如何实现的伪代码,以便它可以作为构造函数和常规函数使用?thanks@Benny请注意以下几点:
function Test(){var private=“private value”;this.public=“public value”;return“return value”}
调用
new Test()
创建一个包含私有和公共值的对象。调用
Test()
返回一个字符串。@Benny下面是它的实现方式:
函数日期(/*…*/){if(!(this instanceof Date)){return new Date().toString();}否则{/*我们得到了
新的
,构造函数逻辑*/}
很有趣,但请注意
日期类型()=='string'
,而不是
'object'
function Date(args){
   if (this.constructor == Date){
        // if you call : new Date(args)
    }else{
        // if you call as method : Date()
      return new Date()
   }

}