javascript中对set和map做浅拷贝应使用构造函数配合解构或迭代器,如new set(originalset)或new map(originalmap),展开运算符和object.assign()无效;该方式仅复制容器结构,内部引用类型值仍共享内存地址。

JavaScript 中对 Set 和 Map 做浅拷贝,不能直接用展开运算符或 Object.assign()(它们对 Set/Map 无效),而应使用各自构造函数配合解构或迭代器来创建新实例。
用构造函数 + 展开语法复制 Set
Set 是可迭代对象,可以直接传入新元素创建副本。注意:这是浅拷贝,内部值(如对象、数组)仍共享引用。
-
✅ 正确写法:
const newSet = new Set(originalSet); -
✅ 也可展开:
const newSet = new Set([...originalSet]); -
❌ 错误写法:
Object.assign(new Set(), originalSet)(不生效)或{...originalSet}(语法错误)
用构造函数 + 展开语法复制 Map
Map 同样支持用可迭代结构初始化,其 entries 是键值对数组,所以需展开整个 Map 实例本身(它默认返回 entries 迭代器)。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
✅ 正确写法:
const newMap = new Map(originalMap); -
✅ 也可显式取 entries:
const newMap = new Map([...originalMap.entries()]); -
❌ 错误写法:
Object.assign(new Map(), originalMap)(不会复制键值对)
注意浅拷贝的局限性
上述方法只复制了容器结构(新 Set/Map 实例),但其中的值(尤其是对象、数组、函数等引用类型)仍是原引用。
- 如果
Set里存的是对象:set.add({a: 1}),拷贝后两个 Set 中该对象仍指向同一内存地址 - 如果
Map的 key 是对象,或 value 是嵌套对象,修改原对象会影响拷贝后的 Set/Map 中对应项 - 需要深拷贝时,得递归处理值,或借助
structuredClone()(现代环境支持)或第三方库
兼容性与替代方案
构造函数方式兼容所有支持 ES6 的环境(包括 Node.js 0.12+、主流浏览器)。若需支持极老环境(如 IE),可用手动遍历:
const newSet = new Set(); originalSet.forEach(v => newSet.add(v));const newMap = new Map(); originalMap.forEach((v, k) => newMap.set(k, v));
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










