2013-05-20 177 views
5

我有两个变量:转换提供了同样的结果

tempTimeRequests timeLastUpdateRequests

无论是在因为毫秒为单位给出。

我从JS面临的怪异行为:

结果我得到

alert(
    tempTimeRequests+"\n"+ 
    timeLastUpdateRequests+"\n"+ 
    Date(tempTimeRequests)+"\n"+ 
    Date(timeLastUpdateRequests) 
) 

1369063665000 
1369063651000 
Mon May 20 2013 17:27:51 GMT+0200 (CEST) 
Mon May 20 2013 17:27:51 GMT+0200 (CEST) 

为什么我的秒的相同值,如果有明确第二次(给出正确的结果)为51秒,而第一次为65秒(这将给出05秒)? 我真的很震惊。

+1

这很奇怪。当我分别打印它们(每个都使用'console.log')时,我会得到正确的值。当我将它们组合成一个'console.log'调用时,它们显示相同的值(对'alert'显然是相同的) – Ian

+2

如果使用'new Date(',它似乎对我有用 – Ian

+2

从MDN:“调用它作为一个常规函数(即没有'new'operator)将返回一个字符串而不是'Date'对象;“所以这似乎是完美无缺的。同样来自ES5:http://es5.github.io/# x15.9.2 – Ian

回答

4

调用Date构造为函数返回当前日期。

specification

15.9.2 Date构造函数作为函数调用

当日期被称为一个函数,而不是作为一个构造函数,它返回一个表示当前的String时间(UTC)

函数调用Date(…)相当于对象创建表达式new Date(…)使用相同参数。

这与使用new Date时不一样,因为它符合您的期望。

+1

很好的解释。谢谢,当我给出我的答案时,我尝试了解这一点。 – Robbert

+0

@Robbert它不是我,它是语言规范:)正在努力使ECMAScript语言规范更易读易用。 http://es5.github.com也引入了简单的导航和链接到像MDN这样的资源。 –

+0

@Benjamin Gruenbaum非常感谢! – DanielX2010

3

这应该可以解决这个问题

alert(
    tempTimeRequests+"\n"+ 
    timeLastUpdateRequests+"\n"+ 
    new Date(tempTimeRequests)+"\n"+ 
    new Date(timeLastUpdateRequests) 
) 
+1

好的,但这并不能解释为什么调用'Date()'单独公开这种行为。是否是一个bug? –

+0

我不确定它为什么这样做,除了Date是对象,并创建一个对象,你使用新的关键字。你调用它的方式是使用它作为一个函数,这可能是一些浏览器支持,但其他人不支持。 – Robbert

+0

我想这是因为当Javascript运行它首先评估“Date(time)”函数,首先将其分配给第一次第二次,然后当构造字符串到alert时,它将Date对象作为一个字符串获得,这个字符串当时将被设置为第二次。 – Shaded

相关问题