JSON序列化与反序列化后对象中函数丢失的原因探究
为什么JSON序列化/反序列化会丢失对象的函数属性?
核心原因:JSON规范不支持函数类型
JSON(JavaScript Object Notation)是纯数据交换格式,它的标准仅定义了6种可序列化的数据类型:字符串、数字、布尔值、null、对象、数组。函数(包括普通函数、箭头函数等所有函数类型)不在这个范围内——JSON的设计初衷是传递静态数据,而非可执行代码。
JSON.stringify的处理机制
调用JSON.stringify处理对象时,它会遍历对象的可枚举属性,遇到以下类型的属性值会直接跳过,不写入最终的JSON字符串:
- 所有函数类型(普通函数、箭头函数、生成器函数等)
undefinedSymbol类型- 不可枚举的属性(默认配置下)
对应你的代码示例:
let a = { "b" : 1, "a" : function(){ return 1; } } let b = { "b" : 2, "a" : ()=>{ return 2; } }
执行JSON.stringify(a)得到的结果是{"b":1},JSON.stringify(b)得到的是{"b":2}——两个对象的a属性(函数类型)都被直接忽略。后续用JSON.parse解析这些字符串,自然只能得到不含函数的对象。
额外说明
如果确实需要在序列化时保留函数逻辑,只能手动将函数转换为字符串(比如obj.fn = obj.fn.toString()),反序列化后再用eval或new Function还原。但这种做法存在严重安全风险(可能执行恶意代码),除非完全信任数据源,否则不建议使用。
内容的提问来源于stack exchange,提问作者Jeel Dhamsaniya
相关产品推荐
相关产品推荐

