json.stringify()仅序列化可枚举属性,且严格遵循json标准:undefined、函数、symbol值均被忽略,无论其描述符如何设置;不可枚举属性(enumerable:false)直接不参与序列化流程。

属性描述符本身不会直接影响 JSON 序列化结果。JSON.stringify() 只关心属性的“可枚举性”和“值类型”,而这两点虽与描述符有关,但并非由描述符主动控制序列化行为——它只是间接反映在对象的运行时状态上。
可枚举性决定属性是否被包含
JSON.stringify() 仅序列化对象自身的可枚举(enumerable: true)属性。如果通过 Object.defineProperty 设置某个属性为 enumerable: false,该属性在序列化时会被完全忽略,无论其值是字符串、数字还是函数。
例如:
const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 'secret',
enumerable: false
});
obj.visible = 'shown';
console.log(JSON.stringify(obj)); // {"visible":"shown"} —— hidden 不出现
函数、undefined、Symbol 值始终被跳过
即使将函数或 undefined 显式设为 enumerable: true,JSON.stringify() 仍会跳过它们。这不是描述符的问题,而是 JSON 标准的硬性限制:
- 函数值:无论 configurable/writable/enumerable 如何设置,一律不序列化
- undefined 值:在对象中直接消失(不是 null),在数组中转为 null
- Symbol 键名:根本不会出现在枚举结果中,因此也不会进入 stringify 流程
getter/setter 属性需谨慎对待
若属性使用 get 访问器,且没有对应 set,它的值取决于 getter 的返回结果:
- 如果 getter 返回基本类型(如字符串、数字),该值会被正常序列化
- 如果 getter 抛错或返回不可序列化值(如函数),则整个序列化可能失败或静默跳过
- setter 不影响序列化,因为它不提供读取路径
注意:JSON.stringify() 不调用 setter,也不保存 setter 定义;它只尝试读取属性值。
不可配置属性不影响序列化逻辑
configurable: false 仅限制后续对描述符的修改(如 delete 或重新 define),对 JSON.stringify() 没有额外作用。只要属性可枚举且值合法,就照常序列化;不可枚举则照常忽略——configurable 状态本身不参与判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











