单独出现时,会返回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() 方法,则该方法的返回值就是转换对象的序列化结果。
该过程会忽略其他属性。
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()。
循环引用的对象执行此方法,会抛出错误。
对象之间相互引用,形成无限循环。
转换BigInt类型的值会抛出TypeError错误。
BigInt值不能JSON序列化
更好的支持unicode转义符
const a = {\'\u0066\': 333} JSON.stringify(a) // \'{"f":333}\'