如http://www.json.org/js.html所述,JavaScript对象可以通过实现toJSON()方法来规定JSON.stringify()如何序列化它们.对于任意对象,此方法未定义,而数字和字符串似乎实现该方法.我很好奇 - 为什么对象没有实现?
编辑:我最初提到数组有这种方法 - 他们没有.我为这种困惑道歉.
你提到的那些方法是由一些JavaScript引擎添加的(AFAIK最新版本的V8和Tracemonkey实现它们):
String.prototype.toJSON
Boolean.prototype.toJSON
Number.prototype.toJSON
Date.prototype.toJSON
Run Code Online (Sandbox Code Playgroud)
虽然唯一由ECMAScript 5规范标准化的是Date.prototype.toJSON.
我个人认为这些方法根本没用,结果来自String,Boolean和Number完全等同于调用valueOf方法,而Date的结果等同于调用toISOString.
所以问题是:为什么本机对象没有toJSON()方法?
好吧,在JSON对象可用的情况下(第15.12节),添加另一种方法Object.prototype是不值得的,而且我认为添加它是一个坏主意...
虽然@CMS是正确的,但是浏览器已经添加了这些,这一点完全被遗漏了.原因是JSON规范要求为toJSON任何对象调用可选方法,而该对象又被调用以将非规范性结构序列化为规范性结构.
var O = function O() {
this.val = 'value';
this.toJSON = function () { return ['VALUE!']; };
};
var o = new O();
var s = JSON.stringify(o);
console.log(s); // >> ["VALUE!"]
Run Code Online (Sandbox Code Playgroud)
一个例子是Set Data-Structure,其结构实际上是一个具有values方法的对象.这将允许人们编写this.toJSON = values;以提供JSON.stringify正确的序列化策略的方法.
因此,简而言之,它JSON.stringify为输出替代结构提供了正确的策略.
希望这可以帮助.