为什么JSON.stringify()接受Date对象?

时间:2012-04-23 18:46:50

标签: javascript json date

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

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

这很有效,因为(在Firefox中)Date包含一个{J}序列化程序使用的toJSON方法。但是,这不是JSON标准的一部分,所以我想知道为什么这个方法存在,或者为什么内置JSON序列化器检查这样的方法。由于它没有标准化,所以如果内置的序列化程序不了解它并且使用自定义的序列化程序(例如json2.js

,则无论如何都不能安全地使用它

1 个答案:

答案 0 :(得分:10)

这是有效的,因为它在规范中的不太清楚的事情中指定。在开始时,您需要深入了解抽象操作 Str 的描述中的 15.12.3 部分,该部分用于将值转换为字符串表示形式。基本上,如果输入是一个对象,则规范要求检查是否存在名为toJSON的可调用值。可以把它想象成Java或C#中的接口。

interface IAmJSON 
{
    string toJSON(string key);
}

这是规范中的确切文字。

2.  If Type(value) is Object, then 
    a.  Let toJSON be the result of calling the [[Get]] internal method of  value with argument "toJSON". 
    b.  If IsCallable(toJSON) is true 
        i.  Let value be the result of calling the [[Call]] internal method of  toJSON passing value as the this value and with an argument list consisting of key. 

最后,日期对象在 15.9.5.44 部分中定义了toJSON