JSON.stringify()可序列化标准类型,但对函数、undefined、Symbol会忽略或转为null,BigInt需自定义toJSON,Date转为字符串,RegExp和Error仅保留可枚举属性,循环引用需用replacer或库处理。

JavaScript的JSON序列化主要通过JSON.stringify()方法实现,但它对特殊对象类型的处理有局限性。该方法只能安全地序列化可枚举的、标准的JSON数据类型(如字符串、数字、数组、普通对象、布尔值、null)。遇到函数、日期、undefined、Symbol、BigInt、RegExp、Error或循环引用等特殊类型时,会进行忽略、转换或报错。
处理方式:自动转换为ISO格式的字符串。
例如:JSON.stringify({ time: new Date() }) 输出:"{\"time\":\"2025-04-05T12:34:56.789Z\"}"
反序列化后不会自动还原为Date对象,仍是一个字符串,需手动转换。
立即学习“Java免费学习笔记(深入)”;
处理方式:在对象中会被忽略;在数组中则变为null。
JSON.stringify({ a: function(){}, b: undefined, c: Symbol('') }) 输出:"{}"
JSON.stringify([function(){}, null, undefined]) 输出:"[null,null,null]"
这些类型不属于JSON规范,因此无法被保留。
处理方式:直接调用JSON.stringify()会抛出错误。
BigInt不能安全地转换为Number,JSON标准也不支持。必须自定义toJSON方法或使用replacer函数。
添加toJSON方法:
BigInt.prototype.toJSON = function() { return this.toString(); }
之后JSON.stringify({ big: 123n }) 输出:"{\"big\":\"123\"}"
处理方式:仅序列化其可枚举属性,通常为空对象。
例如:JSON.stringify({ reg: /abc/i }) 输出:"{\"reg\":{}}"
正则的source、flags等属性不可枚举,因此丢失。若需保留,应手动提取属性。
问题:直接序列化会抛出TypeError。
const obj = { name: "a" };<br/>
obj.self = obj;<br/>
JSON.stringify(obj); // 报错
使用replacer函数过滤掉循环引用,或借助第三方库如flatted、cycle.js来安全序列化。
任何对象都可以定义toJSON方法,JSON.stringify()会优先使用该方法的返回值。
const user = {<br/>
name: "Tom",<br/>
age: 25,<br/>
toJSON: function() { return this.name; }<br/>
};<br/>
JSON.stringify(user); // 输出:"\"Tom\""
这适用于需要自定义输出格式的对象,比如封装了私有状态的类。
基本上就这些。JSON序列化不是万能的,对特殊类型要提前处理,否则容易丢失数据或报错。合理使用replacer、toJSON和类型检查,可以有效控制输出结果。
以上就是JavaScript的JSON序列化如何处理特殊对象类型?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号