浅拷贝仅复制可枚举属性并重置描述符为默认值;不可枚举属性、getter/setter及writable/configurable等元信息均丢失,需用object.getownpropertydescriptors配合object.defineproperties保留完整属性特性。

浅拷贝会保留对象属性的可枚举性(enumerable),但不会保留不可枚举属性、getter/setter、属性描述符(如 writable、configurable)等元信息。
可枚举属性会被完整复制
使用 Object.assign()、展开运算符 {...obj} 或 for...in 循环进行浅拷贝时,所有 enumerable: true 的自有属性都会被复制到新对象中,且新对象上对应属性的 enumerable 仍为 true。
- 例如:
const a = { x: 1 }; Object.defineProperty(a, 'y', { value: 2, enumerable: true });→ 浅拷贝后y依然可被for...in遍历 - 但若
y的enumerable: false,则不会出现在拷贝结果中(因为Object.assign和展开运算符只处理可枚举属性)
不可枚举属性和访问器属性不会被拷贝
浅拷贝方法默认忽略 enumerable: false 的属性,也不会提取 getter/setter 的逻辑,而是直接读取当前值(如果可读)并写死为普通数据属性。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false })→ 浅拷贝后丢失 -
Object.defineProperty(obj, 'computed', { get() { return this.x * 2; }, enumerable: true })→ 拷贝后变成computed: undefined(因为 getter 不执行,且无显式赋值)
属性描述符不会继承
即使原属性是 writable: false 或 configurable: false,浅拷贝生成的新属性默认都是 writable: true、configurable: true、enumerable: true。
- 例如:
Object.defineProperty(obj, 'x', { value: 1, writable: false })→ 浅拷贝后x可被重新赋值 - 想保留完整描述符,需用 Object.getOwnPropertyDescriptors() + Object.defineProperties()
需要保留元信息时的替代方案
若必须保留不可枚举属性、访问器或描述符,不能依赖常规浅拷贝,而应手动操作:
- 获取全部属性键(含不可枚举):
Object.getOwnPropertyNames(obj)或Reflect.ownKeys(obj) - 获取完整描述符:
Object.getOwnPropertyDescriptors(obj) - 定义新对象:
Object.defineProperties({}, descriptors)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










