JSON.stringify()会忽略enumerable为false的属性,另三个同样跳过它的操作是for...in、Object.keys()和Object.assign();该机制独立于undefined、function、Symbol等值类型的忽略规则。

当对象属性的 enumerable 为 false 时,JSON.stringify() 会完全忽略该属性,不会将其包含在最终生成的 JSON 字符串中。
哪些操作会跳过 enumerable: false 的属性
JSON.stringify 是明确受 enumerable 控制的四个核心操作之一(另三个是 for...in、Object.keys()、Object.assign())。只要属性描述符中 enumerable: false,它就:
- 不出现在 JSON.stringify() 的输出结果里
- 即使能直接访问(如 obj.prop 或 obj["prop"]),也不会被序列化
- 不受值类型影响——哪怕它是字符串、数字或布尔值,只要不可枚举,就丢弃
和其它“消失”原因的区别
JSON.stringify 忽略属性有多种情况,但 enumerable: false 是其中一种独立且明确的机制,和其他常见原因互不重叠:
- undefined 值:属性存在且可枚举,但值为 undefined → 被跳过
- function / symbol / undefined 类型的属性值:无论 enumerable 是 true 还是 false,一律不序列化
- enumerable: false:属性值合法(比如字符串、对象),但因不可枚举而被过滤
实际例子看效果
以下代码清晰展示 enumerable 如何影响 JSON.stringify:
立即学习“Java免费学习笔记(深入)”;
const obj = { a: 1 };Object.defineProperty(obj, 'b', { value: 2, enumerable: false });
Object.defineProperty(obj, 'c', { value: 3, enumerable: true });
console.log(JSON.stringify(obj)); // {"a":1,"c":3} —— b 消失了
console.log(obj.b); // 2 —— 属性仍可正常读取
如何确认一个属性是否被忽略
可以用两个方法交叉验证:
- obj.propertyIsEnumerable('key'):返回布尔值,直接查该属性是否可枚举
- Object.getOwnPropertyDescriptors(obj):查看完整描述符,包括 enumerable 字段值
注意:Object.keys() 和 JSON.stringify() 行为一致,都只处理 enumerable: true 的自有属性;而 Object.getOwnPropertyNames() 不看 enumerable,会列出所有自有属性名。


















