考虑:
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)
我希望他们回归同样的事情,但后来我读了
如果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的存在中意识到这一点.
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)
| 归档时间: |
|
| 查看次数: |
8065 次 |
| 最近记录: |