展开运算符(...)对对象进行浅拷贝时,仅提取自身可枚举属性并逐个读取赋值,触发getter但不触发setter,不保留访问器、不可枚举属性、原型链属性及响应式机制,同名属性按展开顺序覆盖。

展开运算符(...)在 JavaScript 中用于对象或数组的浅拷贝,但它不是简单地“复制属性”,而是在解构时对键值进行**逐个提取再重新赋值**的过程。这个过程会触发属性的读取与写入,影响可枚举性、访问器属性(getter/setter)、以及原型链上的属性行为。
只拷贝自身可枚举属性
展开运算符仅遍历对象自身的、可枚举的(enumerable: true)属性,忽略不可枚举属性和原型链上的属性。
- 例如:
Object.defineProperty(obj, 'hidden', { value: 1, enumerable: false })中的hidden不会被展开出来 - 继承自原型的方法(如
toString)也不会出现在展开后的对象中
访问器属性会被执行并转为数据属性
如果原对象某个属性是 getter,展开时会调用该 getter,把返回值作为新对象的**普通数据属性**写入,不再保留 getter 行为。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 注意:setter 不会被触发,因为展开是读取 + 赋值,不涉及写入原属性
- 示例:
const obj = { get x() { return Date.now(); } }; const copy = { ...obj };→copy.x是一个固定的时间戳,不再是实时计算值
同名属性会覆盖,顺序决定最终值
展开多个对象时,后展开的对象中同名属性会覆盖前面的。这本质是按顺序执行属性赋值操作。
-
const a = { x: 1 }; const b = { x: 2 }; const c = { ...a, ...b };→c.x === 2 - 也可以混用字面量:
{ ...a, y: 3, ...b },其中y是新增属性,x来自b
不触发 setter,也不保留响应式机制
展开运算符生成的是普通 JavaScript 对象,不会保留 Vue 的响应式属性、Proxy 拦截、或任何自定义 setter 逻辑。
- 即使原对象用
Object.defineProperty设置了 setter,展开后的新对象里对应属性只是普通值 - 对展开后对象的修改,不会反向影响原对象,也不会触发原对象的 setter 或依赖追踪
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










