如果我运行这样一个简单的测试:
新日期(新日期(1050))。valueOf()
而不是获得1050,我得到1000.这发生在Firefox和Internet Explorer上。
Google Chrome和Opera正确返回1000。
答案 0 :(得分:3)
内部日期可能会转换为字符串,然后由外部日期的构造函数解析。
请注意,在所有浏览器中:
new Date(new Date(1050).toString()).valueOf()
返回1000,而:
new Date(new Date(1050).valueOf()).valueOf()
返回1050。
toString
的输出根本不包含任何毫秒信息。
也许其他人可以回答为什么某些浏览器在这些“隐式转换”中使用toString
代替valueOf
"场景。我的猜测是ECMAScript规范中的行为未定义 - 但我还没有检查过。
答案 1 :(得分:2)
马特有你的答案,但要在规范中追踪它:
new Date(value)
首先致电ToPrimitive(value)
在 toString 或解析步骤中,毫秒被删除。但是,我无法想象将时间值转换为字符串,然后返回到一个表达式中的时间值的原因。
请注意,此解析意味着类似new Date('5/5/70')
之类的内容将创建1970年5月5日的日期对象,即使需要70AD年份也是如此。因此,如果您使用new Date(dateObject)
复制日期对象,最好让new Date(+dateObject)
强制将日期强加给time value,而不是让ECMA-262使用它的方式和使用字符串值。虽然您不太可能需要复制0到99AD范围内的日期,但很高兴知道如果尝试它会正常工作。
答案 2 :(得分:0)
试试这个:
new Date(new Date(1050).getTime()).getTime()
这将在所有浏览器中获得与“1050”相同的结果。