JSON.stringify额外的引号

Mat*_*sen 12 javascript json

考虑:

var d = new Date();
var j = d.toJSON();
var s = JSON.stringify(d);
Run Code Online (Sandbox Code Playgroud)

每个变量的console.log返回:

Tue Jul 29 2014 13:27:19 GMT+0200 (W. Europe Summer Time)
2014-07-29T11:27:19.253Z // a string
"2014-07-29T11:27:19.253Z" // same string as above but packed in ""
Run Code Online (Sandbox Code Playgroud)

我希望他们回归同样的事情,但后来我读了

http://www.json.org/js.html:

如果stringify方法看到包含toJSON方法的对象,则它会调用该方法,并将返回的值字符串化.这允许对象确定自己的JSON表示.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify:

如果要进行字符串化的对象具有名为toJSON的属性,其值为函数,则toJSON方法会自定义JSON字符串化行为:而不是被序列化的对象,调用时toJSON方法返回的值将被序列化.例如:

这是否意味着我总是要做以下事情:

var d = new Date();
var j = d.toJSON();
var s;

if (d.toJSON) {
    s = d.toJSON();
} else {
    s = JSON.stringify(d);
}
Run Code Online (Sandbox Code Playgroud)

确保s == j,因为我不能依赖JSON.stringify不执行两个序列化?

编辑

根据jgillich的回答,以下代码有助于澄清事情(至少对我而言):

var s = "xxx"
s = JSON.stringify(s)
s = JSON.stringify(s)
s = JSON.stringify(s)
s = JSON.stringify(s)
s = JSON.stringify(s)
console.log(s)
Run Code Online (Sandbox Code Playgroud)

收益:

""\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"xxx\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"""
Run Code Online (Sandbox Code Playgroud)

即JSON.stringify不返回字符串表示,而是返回对象的序列化.您认为我会从名称和toString的存在中意识到这一点.

jgi*_*ich 7

toJSON()不是一个旨在返回JSON的函数.相反,它是一个函数,当它存在时,在JSON序列化发生之前被调用.以下是完全相同的:

JSON.stringify(new Date().toJSON()); // toJSON called manually
JSON.stringify(new Date()); // toJSON called by the serializer
Run Code Online (Sandbox Code Playgroud)