为何Object.entries与JSON.stringify无法获取Map对象的size属性?
为什么JSON.stringify和自定义writeData函数无法序列化Map的size属性?
核心原因:JSON序列化规则与Map属性特性不匹配
1. JSON.stringify的序列化逻辑限制
JSON.stringify只会处理对象的可枚举自有属性——也就是直接属于实例本身、且enumerable标志为true的属性。而Map的size是一个原型链上的访问器属性(getter),它既不是Map实例的自有属性,也被标记为不可枚举,所以会被JSON.stringify直接忽略。另外,Map属于JavaScript的特殊集合类型,JSON默认没有内置的序列化规则,默认会把整个Map序列化为空对象{}。
2. Map的size属性本质
你可以用Object.hasOwn(mapInstance, 'size')验证,结果会是false,这说明size并不是Map实例自身的属性,而是定义在Map.prototype上的访问器。这种属性不会被常规的对象遍历(比如for...in循环)捕获到,自然也不会被基于常规对象遍历实现的自定义writeData函数识别。
3. 和C# Dictionary的差异
你有C#开发经验,可能习惯了Dictionary的Count属性能被直接序列化。这是因为C#的序列化框架(比如Json.NET)会主动处理类的公共属性,不管它是字段还是getter属性;但JavaScript的JSON序列化规则更“严格”,只聚焦于对象自身的可枚举属性,两者设计逻辑不一样。
实现期望输出的方法
如果要得到{"size": 1}的输出,需要手动转换Map为普通对象:
const myMap = new Map(); myMap.set('test', 'value'); // 手动提取size属性 const serializableObj = { size: myMap.size }; console.log(JSON.stringify(serializableObj)); // 输出 {"size":1}
或者在你的自定义writeData函数里,增加Map类型的判断逻辑:
function writeData(data: unknown): string { if (data instanceof Map) { return JSON.stringify({ size: data.size }); } // 原有处理普通对象的逻辑 return JSON.stringify(data); }
内容的提问来源于stack exchange,提问作者Дмитрий Кондратенко
相关产品推荐
相关产品推荐

