- From: Boris Zbarsky <bzbarsky@mit.edu>
- Date: Wed, 16 Nov 2016 10:04:32 -0500
- To: public-script-coord@w3.org
On 11/16/16 1:17 AM, Marcos Caceres wrote: > However, it doesn't define how a UA actually would check the above... > apart from basically calling: > > ```JS > try { > JSON.parse(JSON.stringify(obj)); > } catch(err){ > throw new Error("Not a JSON-serializable object"); > } Not good enough. You can easily create a proxy which will throw on every even-numbered call to JSON.stringify, say. A UA _could_ check something along the lines of (for non-array objects): 1) The [[GetPrototypeOf]] of the object is https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-getprototypeof 2) The prototype of the object is Object.prototype. 3) The object's [[GetOwnProperty]] is https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-getownproperty-p 4) The object's [[OwnPropertyKeys]] is https://tc39.github.io/ecma262/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys 4) Neither the object nor Object.prototype have an accessor property named "toJSON", and if they have a value propety with that name then its value is not callable. 5) The object is not a Number object or a String object or a Boolean object. 6) The object is not callable. 7) For each string-named own property of the object, the following hold: a) It is a value property. b) The value is an object, null, a boolean, a string, or a number. c) If the value is an object, it is itself JSON-serializable. d) If the value is a number, it's finite and is not -0. Plus some conditions around arrays that I have not dug into. At the very least requires no holes and that all values satisfy item 7 above. I make no claim that the above checks are sufficient. For example, I strongly suspect that if you take a Node with no extra properties defined on it and Object.setPrototypeOf its prototype to Object.prototype then it would pass all the above tests, but presumably not be considered "JSON-serializable" by the dataloss condition cited. But the above checks are certainly necessary. Note also that whether an object is "JSON-serializable" by this definition depends on some seriously non-local state... -Boris
Received on Wednesday, 16 November 2016 15:05:07 UTC