意外的 Javascript Date 对象隐式转换

Unexpected Javascript Date object implicit conversion

本文关键字:转换 对象 Date Javascript 意外      更新时间:2023-09-26

为什么Javascript的Date对象为隐式转换返回不同的值?

号码转换:

+new Date()
// returns 1456293356618 as expected

字符串转换:

''+new Date()
// returns "Wed Feb 24 2016 09:26:28 GMT+0" but "1456293356618" as a string was expected 

我在哪里可以找到 ECMAScript 的文档和 v8 源代码上的实现?

编辑:我不是在为预期结果寻找解决方案。我想在规格中找到文档。

+运算符重载。在:

+new Date()

它被视为一元 + 运算符,并将值强制为 Number。在:

'' + new Date() // note one value is a string

它被视为字符串串联运算符,并将值强制转换为 String。在:

5 + 6   // note both values are number

它被视为加法运算符。由于值是数字,因此不需要强制。

请注意,+加法还是串联取决于值,在 ECMAScript 2015 §12.7.3.1 步骤 11 中有描述。

我认为您指的是日期对象概述和抽象运算符的定义,特别是第 20.3.1.1 节

Date 对象包含一个数字,指示在一毫秒内的特定时刻。这样的数字称为时间值。时间值也可以是 NaN,指示 Date 对象不表示特定的时刻。

这意味着对 Date 对象使用数学运算将提取其 Number 值以使其工作。这就是为什么像 +new Date()Math.floor(new Date()) 这样的语句会返回一个数字。

至于'' + new Date(),Date 对象可能使用其 toString() 函数返回其字符串值。