考虑:
var d = new Date();
var j = d.toJSON();
var s = JSON.stringify(d);
每个变量的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 ""
我希望他们返回同样的东西,但后来我读了
如果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);
}
确保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)
返回:
""\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"xxx\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"""
即。 JSON.stringify不返回字符串表示,而是返回对象的序列化。您认为我会从名称和toString的存在中意识到这一点。
答案 0 :(得分:5)
toJSON()
不是一个返回JSON的函数。相反,它是一个函数,当它存在时,在之前被称为 JSON序列化。以下是完全相同的:
JSON.stringify(new Date().toJSON()); // toJSON called manually
JSON.stringify(new Date()); // toJSON called by the serializer