javascript深拷贝需用object.getownpropertysymbols()提取symbol键,因for...in和object.keys()等无法访问不可枚举的symbol属性;再递归拷贝值并赋给目标对象,symbol的全局性或局部性不影响拷贝逻辑。

JavaScript 中深拷贝要正确复制 Symbol 类型的键名,关键在于:普通 for...in 或 Object.keys() 都无法访问 Symbol 属性,必须用 Object.getOwnPropertySymbols() 显式提取。
Symbol 键不会被常规遍历方法捕获
Symbol 作为对象属性名时是“不可枚举”的(即使设置了 enumerable: true),所以 for...in、Object.keys()、JSON.stringify() 全部忽略它。例如:
// 这样的 Symbol 属性会被完全跳过
const obj = { a: 1 };<br>
const sym = Symbol('id');<br>
obj[sym] = 'abc';<br>
console.log(Object.keys(obj)); // ['a'] —— sym 不在结果中<br>
console.log(JSON.stringify(obj)); // {"a":1} —— sym 被丢弃
必须用 Object.getOwnPropertySymbols() 提取 Symbol 键
该静态方法返回对象所有自有 Symbol 属性组成的数组,是唯一可靠入口:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
Object.getOwnPropertySymbols(obj)获取所有 Symbol key - 配合
Object.getOwnPropertyDescriptors()可同时获取 descriptor(含enumerable、writable等),适合保留属性特性 - 再用
Object.defineProperty()或直接赋值方式写入新对象
在递归深拷贝中加入 Symbol 处理逻辑
手写深拷贝函数时,在处理普通对象分支里补充 Symbol 支持:
- 调用
Object.getOwnPropertySymbols(source)获取所有 Symbol 键 - 遍历这些 Symbol 键,对每个
source[sym]值做深拷贝(如果是引用类型就递归,基本类型直接赋值) - 将拷贝后的值赋给目标对象:
target[sym] = clonedValue
// 示例片段(简化版)
const symbols = Object.getOwnPropertySymbols(source);<br>
symbols.forEach(sym => {<br>
const value = source[sym];<br>
target[sym] = isPlainObject(value) || Array.isArray(value)<br>
? deepClone(value)<br>
: value;<br>
});
注意 Symbol 的“全局性”与“局部性”不影响拷贝逻辑
无论是 Symbol('a')(局部唯一)还是 Symbol.for('a')(全局注册),深拷贝时都只关心当前对象是否拥有该 Symbol 键及其对应值。拷贝后得到的是新对象上一个相同 Symbol 的键(不是引用原 Symbol,而是复用同一个 Symbol 值),这符合预期——Symbol 本身是原始值,可安全复用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










