为什么JavaScript对象没有toJSON()方法?

Jef*_*her 8 javascript json

http://www.json.org/js.html所述,JavaScript对象可以通过实现toJSON()方法来规定JSON.stringify()如何序列化它们.对于任意对象,此方法未定义,而数字和字符串似乎实现该方法.我很好奇 - 为什么对象没有实现?

编辑:我最初提到数组有这种方法 - 他们没有.我为这种困惑道歉.

CMS*_*CMS 6

你提到的那些方法是由一些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,BooleanNumber完全等同于调用valueOf方法,而Date的结果等同于调用toISOString.

所以问题是:为什么本机对象没有toJSON()方法?

好吧,在JSON对象可用的情况下(第15.12节),添加另一种方法Object.prototype是不值得的,而且我认为添加它是一个坏主意...

  • 实际上有一个有效的动机,有toJSON()而不是使用valueOf:多态.如果Object实现toJSON(),你可以只执行anyObj.toJSON()并停止担心对象类型,或者是否定义了函数. (5认同)

Cod*_*ody 6

真正的原因

虽然@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为输出替代结构提供了正确的策略.

希望这可以帮助.