JSON.parse 和 JSON.stringify 详解 (3)

单独出现时,会返回undefined。

JSON.stringify(Symbol()) // undefined JSON.stringify([Symbol(), Math.abs, undefined]) // \'[null,null,null]\' JSON.stringify({ [Symbol()]: Math.abs, key: undefined }) // \'{}\'

NaN、Infinity和-Infinity等值,还有null,都会被序列化成null。

JSON.stringify(null) // \'null\' JSON.stringify(NaN) // \'null\'

Object对象,以及Map/Set/WeakMap/WeakSet等复合类型对象,序列化时会忽略对象的不可遍历属性。

const obj = {} Object.defineProperties(obj, { \'json\': { value: \'JSON\', enumerable: true }, \'stringify\': { value: \'STRINGIFY\', enumerable: false } }) JSON.stringify(obj) // \'{"json":"JSON"}\'

以symbol为属性名的属性将被忽略。

JSON.stringify({[Symbol()]: 333}) // \'{}\'

除了数组,其他对象的属性在序列化时,顺序可能会乱。

const a = { \'1\': 911, \'r\': 822, \'11\': 9922} JSON.stringify(a) // \'{"1":911,"11":9922,"r":822}\'

转换的对象如果定义了 toJSON() 方法,则该方法的返回值就是转换对象的序列化结果。
该过程会忽略其他属性。

const a = { key: \'json\' } a.toJSON = () => \'JSON\' JSON.stringify(a) // \'"JSON"\'

RegExp对象、Error对象都会序列化为空对象字符串。

JSON.stringify(/\d/) // "{}" JSON.stringify(new Error()) // "{}"

想要序列化相应对象,需要设置实现toJSON方法才行。

RegExp.prototype.toJSON = RegExp.prototype.toString JSON.stringify(/\d/) // \'"/\\\\d/"\'

Date对象已经定义了toJSON(),并将其转换为string字符串,因此可被序列化。
同Date.toISOString()。

JSON.stringify(new Date()) // \'"2021-12-31T02:24:05.477Z"\'

循环引用的对象执行此方法,会抛出错误。
对象之间相互引用,形成无限循环。

const a = {} a.key = a JSON.stringify(a) // Uncaught TypeError: Converting circular structure to JSON

转换BigInt类型的值会抛出TypeError错误。
BigInt值不能JSON序列化

JSON.stringify(12n) // Uncaught TypeError: Do not know how to serialize a BigInt

更好的支持unicode转义符

const a = {\'\u0066\': 333} JSON.stringify(a) // \'{"f":333}\'

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgywyp.html