set构造函数支持传入任何可迭代对象(如数组、字符串、map的键/值、已有set等)初始化,自动去重并基于samevaluezero算法处理nan;非可迭代对象(如普通对象字面量)会报错。

哪些对象可以作为初始化参数
只要满足可迭代协议(即拥有 [Symbol.iterator] 方法),就能传给 new Set():
- 普通数组:
new Set([1, 2, 2, 3])→{1, 2, 3} - 字符串:
new Set('abac')→{'a', 'b', 'c'}(每个字符一项) - 已有 Set 实例:
new Set(new Set([1, 2]))→ 原样复制 - Map 的键或值:
new Set(map.keys())或new Set(map.values()) - 自定义迭代器对象(含生成器函数返回的迭代器)
初始化时自动去重的逻辑
Set 不会对比值的“相等性”做深度判断,而是基于 SameValueZero 算法(类似 ===,但 NaN === NaN 返回 false,而 Set 中 NaN 被视为相同):
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
new Set([1, '1', true, NaN, NaN])→{1, '1', true, NaN}(两个NaN视为重复) - 对象引用不同即视为不同项:
new Set([{a:1}, {a:1}])→ 包含两个独立对象
常见初始化写法示例
简洁初始化最常用,也支持链式调用或配合解构:
- 基础去重:
const unique = new Set([1, 2, 2, 3, 3]); - 从字符串提取不重复字符:
const chars = new Set('hello world');→{'h','e','l','o',' ','w','r','d'} - 结合展开运算符转回数组:
[...new Set([1,2,2,3])] // [1,2,3] - 从 Map 初始化键集合:
const keysOnly = new Set(myMap.keys());
不能直接初始化的情况
非可迭代对象会报错,比如普通对象字面量(无 [Symbol.iterator]):
- ❌ 错误:
new Set({a:1, b:2})→ 报TypeError: object is not iterable - ✅ 正确:先取
Object.keys()或Object.values():new Set(Object.keys(obj))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










