You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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,提问作者Дмитрий Кондратенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:12:38