Symbol属性在JSON.stringify中彻底隐身,因JSON标准要求键必须为字符串且Symbol不可枚举,故遍历阶段直接跳过,连“丢弃”动作都不存在。

JSON.stringify 忽略 Symbol 属性,不是靠“过滤”或“丢弃”,而是因为它压根就扫描不到——这背后没有魔法,只有两层硬性限制:JSON 规范的键类型约束 + JavaScript 引擎遍历对象时的可枚举性逻辑。
Symbol 键根本不符合 JSON 的语法定义
RFC 8259 明确规定:JSON 对象的键(key)必须是 字符串。Symbol 是 JS 独有的原始类型,既不是字符串,也不能被强制转为合法 JSON 键(不像 Date 会调用 toString()、BigInt 会报错)。所以当 stringify 开始构造 JSON 文本时,遇到 Symbol 键,连“要不要保留”的判断都不会触发——它直接不进入键名收集流程。
Symbol 属性默认不可枚举,遍历阶段就被跳过
JSON.stringify 内部使用类似 Object.keys() 或 for...in 的机制遍历对象属性,而这两者都只访问 可枚举的自有属性。Symbol 属性默认不可枚举(即使你用 Object.defineProperty 手动设成 enumerable: true,也仍因第一层限制被拒之门外)。所以整个遍历循环里,Symbol 键值对就像不存在一样,不会传给 replacer,也不会出现在序列化路径中。
Symbol 值在对象中同样不出现,连 null 都不算
如果 Symbol 出现在属性值位置(如 { token: Symbol('api') }),它也不会变成 "token":null。因为 stringify 对每个值单独处理时,遇到 typeof value === 'symbol' 就直接返回 undefined;而当这个 undefined 作为对象属性值时,整条键值对被静默剔除(不报错、不占位、不触发 replacer)。这不是策略性忽略,是类型检查后提前退出分支。
这不是设计选择,而是规范与实现的自然交集
ECMA-404(JSON 标准)不支持 Symbol → 浏览器/Node 的 JSON 实现严格遵循该标准 → 引擎在实现 stringify 时,按规范只处理七种有效 JSON 类型(string/number/boolean/null/object/array)→ Symbol 不在此列,且无降级转换规则 → 最终表现为“彻底隐身”。它不像 undefined 在数组里会被转成 null,Symbol 在任何上下文中都不参与序列化流程。


















