Set 的 size 属性直接返回去重后的元素个数,是 O(1) 只读属性,反映内部实时计数;它不同于数组 length,不支持赋值,且 Set 无 length 属性。

size 属性直接返回 Set 当前包含的不重复元素个数,无需遍历或去重处理——这是它和数组 length 最本质的区别:它天然反映“去重后的真实数量”。
为什么 size 不是方法而是属性
因为 Set 内部维护着元素计数,每次 add()、delete() 或 clear() 都会同步更新该值,读取 size 是 O(1) 操作,比调用 Array.from(mySet).length 或展开运算符 [...mySet].length 快且安全。
-
size是只读属性,赋值无效(如mySet.size = 5不报错但无效果) - 空
Set的size恒为0,哪怕刚用new Set([1, 1, 2])初始化,结果也是2 - 对已删除的引用对象,只要没被垃圾回收且仍被
Set持有,仍会计入size
size 和数组 length 混用的典型错误
把 Set 当成数组用会导致误判。比如想“清空并检查是否为空”,写成 mySet.length === 0 ——这永远是 undefined,因为 Set 没有 length 属性。
- ✅ 正确判断空集合:
mySet.size === 0 - ❌ 错误写法:
mySet.length === 0(返回undefined,比较结果为false) - ⚠️ 注意陷阱:从
Map的keys()或values()得到的是迭代器,不是Set,也没有size属性
嵌套结构或特殊值影响 size 吗
不影响。只要 Set 认为两个值不相等,就会视为不同元素;size 只统计当前实际持有的元素个数,与值类型无关。
-
NaN和NaN在Set中被视为相同,只计 1 次 - 对象按引用比较:
new Set([{a:1}, {a:1}])的size是2 -
new Set([0, -0])的size是1(ES6 规定0和-0相等)
真正容易被忽略的是:当你用 Set 做状态缓存或防重复提交时,size 看似简单,但它的准确性完全依赖于你插入的值是否真的满足“唯一性预期”——比如用对象做键却忘了统一引用,size 就会悄悄变大,而你可能还在奇怪“为什么没去重”。

















