为何使用Object.assign克隆对象后删除属性仅影响克隆对象?
为什么删除克隆对象的属性不会影响原对象?
嘿,这个问题其实涉及到 JavaScript 里浅拷贝的核心逻辑,咱们一步步拆解来理解:
1. Object.assign() 做了什么?
当你执行 const object2 = Object.assign({}, object1) 时,它完成的是浅拷贝操作:
- 对于
object1里的顶层基本类型属性(比如b: 2、c: 3),会直接把值复制到新创建的空对象里; - 对于
a这种引用类型属性(它的值是另一个对象),并不会复制整个内部对象,而是把内存引用地址复制给了object2.a。也就是说,object1.a和object2.a指向的是内存中同一个对象。
2. delete object2.a 到底删了什么?
delete 操作的作用是移除对象自身的某个属性键,而不是修改属性指向的值。当你执行 delete object2.a 时:
- 你只是从
object2这个对象的属性列表里移除了a这个键,相当于把object2和那个内部对象的关联切断了; - 但
object1的属性列表里依然保留着a这个键,并且还指向原来的内部对象,所以object1完全不受这个操作的影响。
3. 额外对比:如果修改属性值会怎样?
如果咱们不是删除 object2.a,而是修改它的子属性,比如 object2.a.d = 100,那 object1.a.d 也会变成100——因为两者指向同一个内部对象。但 delete 是直接操作对象的属性键,和共享的内部对象无关,所以才会出现你看到的结果。
看你的代码输出也能印证这一点:执行 delete 前两个对象结构完全一致,执行后 object2 丢失了 a 属性,但 object1 的 a 属性依然完好。
内容的提问来源于stack exchange,提问作者Martial
相关产品推荐
相关产品推荐

