12

至少在 Firefox 中,您可以对 Date 对象进行字符串化:

>>> JSON.stringify({'now': new Date()})
'{"now":"2012-04-23T18:44:05.600Z"}'

这是有效的,因为(在 Firefox 中)Date包含toJSON其 JSON 序列化程序使用的方法。但是,这不是 JSON 标准的一部分,所以我想知道为什么存在这种方法,或者更确切地说,为什么内置 JSON 序列化程序会检查这种方法。由于它不是标准化的,如果不首先测试内置序列化程序是否理解它,则无论如何都不能安全地使用它,否则使用自定义序列化程序(例如json2.js

4

1 回答 1

12

这是有效的,因为它是在规范中以不太明确的方式指定的。首先,您需要深入了解抽象操作Str的描述中的第15.12.3节,该操作用于将值转换为字符串表示形式。本质上,如果输入是一个对象,规范要求检查是否存在名为 的可调用值。将其视为 Java 或 C# 中的接口。toJSON

interface IAmJSON 
{
    string toJSON(string key);
}

这是规范中的确切文本。

2. 如果 Type(value) 是 Object,那么
    一种。让 toJSON 成为使用参数“toJSON”调用 [[Get]] 内部值方法的结果。
    湾。如果 IsCallable(toJSON) 为真
        一世。令 value 为调用 toJSON 的 [[Call]] 内部方法的结果,将 value 作为 this 值传递,并带有一个由 key 组成的参数列表。

最后,日期对象已toJSON在第15.9.5.44节中定义。

于 2012-04-23T19:08:02.050 回答