原始类型没有“深浅拷贝”之分,因为它们按值存储于栈内存,赋值时直接复制值本身而非地址,天然生成独立副本;只有引用类型(如object、array等)才存在共享引用问题,需区分浅拷贝与深拷贝。

原始类型(String、Number、Boolean、Null、Undefined、Symbol、BigInt)在 JavaScript 中不需要也不支持深度拷贝。
为什么原始类型没有“深浅拷贝”之分?
因为它们的值直接存储在栈内存中,赋值时复制的是值本身,不是地址。每次赋值都天然生成独立副本:
- let a = 42; let b = a; → 修改 b = 100,a 仍是 42
- const str1 = "hello"; const str2 = str1; → str2 是全新字符串,与 str1 内存隔离
- 即使嵌套在对象里,原始类型属性仍按值传递:obj1 = { x: true }; obj2 = { ...obj1 }; → obj2.x 是独立布尔值,改它不影响 obj1.x
混淆常来自引用类型的嵌套
所谓“原始类型被深拷贝”,其实是深拷贝操作对整个对象结构的副作用,并非针对原始类型本身:
- JSON.parse(JSON.stringify({ a: 1, b: "ok" })) → 原始值 1 和 "ok" 被重新解析为新值,但这只是序列化/反序列化的自然结果
- structuredClone({ n: Symbol("s") }) → 现代 API 可保留 Symbol,但本质仍是创建新 Symbol 实例,而非“拷贝”旧 Symbol
- 函数、undefined、NaN、Infinity 等在 JSON 方案中会丢失或转为 null,正说明该方案不处理原始类型语义,只做字符串转换
真正需要关注的是引用类型
只有 Object、Array、Date、RegExp、Map、Set、函数等引用类型才存在共享引用问题,才需区分浅拷贝(一层)与深拷贝(递归全层):
- 浅拷贝:Object.assign()、展开运算符、slice() —— 原始值照常独立,引用值仍共享
- 深拷贝:structuredClone()(推荐)、手写递归(带 WeakMap 防循环)、第三方库 —— 确保所有嵌套引用类型也生成新实例
- 原始值始终是“安全”的,问题永远出在对象、数组这些容器内部的引用关系上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











