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

为何JavaScript中Set的size在删除Map内部键后仍保持为2?

为什么两次打印Set的size都是2?

你写的代码里,原本期望删除Set中的一个Map实例,但实际上只是修改了Map内部的键值对,所以Set的size没有变化。

先看你的原始代码:

const topmap = new Map();

const map1 = new Map();
const map2 = new Map();

const set1 = new Set();

map1.set('x','y');
map1.set('a','b');

set1.add(map1);
set1.add(map2);
topmap.set('ID',set1);


console.log(topmap.get('ID').size); // 打印2
topmap.get('ID').forEach(x => {
  if(x.has('x')){x.delete('x')}
})
console.log(topmap.get('ID').size) // 还是打印2

问题原因

你在forEach里调用的x.delete('x')是Map对象的delete方法,作用是删除map1这个Map里的键为'x'的键值对,而不是把map1从Set中移除。Set里的两个Map实例(map1和map2)都还存在,所以size始终是2。

正确实现

如果要把包含键'x'的Map从Set中删除,需要调用Set的delete方法,代码修改如下:

const topmap = new Map();

const map1 = new Map();
const map2 = new Map();

const set1 = new Set();

map1.set('x','y');
map1.set('a','b');

set1.add(map1);
set1.add(map2);
topmap.set('ID',set1);


console.log(topmap.get('ID').size); // 打印2
const targetSet = topmap.get('ID');
targetSet.forEach(x => {
  if(x.has('x')){
    targetSet.delete(x); // 调用Set的delete方法移除元素
  }
})
console.log(topmap.get('ID').size) // 打印1

这样修改后,第二次打印的size就会变成1,因为map1已经被从Set中成功移除了。

内容的提问来源于stack exchange,提问作者yazumin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:31:12