set 在 json.stringify 中被静默丢弃而返回 {},因其内部数据存于隐藏的 [[entries]],不可枚举;应使用 instanceof set 判断类型,序列化时用 array.from() 转换。

Set 对象在 JSON.stringify 中会被序列化为空对象 {},这不是“识别为空对象”,而是根本没被正确序列化——它被静默丢弃了。
为什么 Set 会变成 {}
JSON.stringify 只处理标准的可枚举属性,且只支持基本类型(string、number、boolean、null)、数组、普通对象。Set 是内置构造函数创建的特殊对象,其内部数据存储在隐藏的 [[Entries]] 中,不属于自有可枚举属性。
当你执行:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
console.log(JSON.stringify(new Set([1, 2]))); // "{}"
结果都是 {},因为 JSON.stringify 遍历不到 Set 的元素,也找不到任何可序列化的自有属性,最终返回空对象字面量。
这个坑带来的实际问题
- 误判数据状态:用
JSON.stringify(obj) === '{}'判断“是否为空”,却把new Set()当成空对象,而它其实可能刚初始化、后续要加数据 - 深拷贝失效:直接 JSON.parse(JSON.stringify(set)) 得到的是空对象,不是新 Set
- 调试困惑:打印或日志里看到
{},以为是普通空对象,实则是个无法通过常规方式还原的 Set
如何安全识别和处理 Set
- 用
obj instanceof Set明确判断类型,不要依赖字符串形式 - 需要序列化时主动转换:
JSON.stringify(Array.from(mySet)) - 做空值检查时,对 Set 单独处理:
mySet.size === 0 - 若需统一判断“逻辑上是否为空”,建议封装函数,按类型分路径处理:
– 普通对象 →Object.keys(obj).length === 0
– Set →obj.size === 0
– Map →obj.size === 0
– Array →obj.length === 0
延伸提醒:其他类似“隐身”类型
Map、Date、RegExp、TypedArray、BigInt、Promise 等,同样无法被 JSON.stringify 正确表示:
JSON.stringify(new Map()) // "{}"JSON.stringify(new Date()) // "2026-05-07T03:58:00.000Z"(Date 是特例,有默认转换)
JSON.stringify(/abc/) // "{}"
JSON.stringify(BigInt(123)) // 报错 Uncaught TypeError
它们都不该依赖 JSON.stringify 做类型判断或空值校验。










