js浅拷贝与深拷贝理解


深拷贝与浅拷贝理解

浅拷贝:浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;

深拷贝:会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

补充1:如果是基本数据类型,名字和值都会储存在栈内存中。如果是引用数据类型,名字存在栈内存中,值存在堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值

补充2:深浅拷贝是相对于引用类型的,以便于我们对引用类型父对象的保存

深拷贝与浅拷贝区别

相同点:深拷贝和浅拷贝都只针对引用数据类型。

不同点:浅拷贝只拷贝一层对象的属性,而深拷贝则递归拷贝了所有层级。

浅拷贝例子及解析

var a = [1, 2, 3]
var b = a
b[0] = 3
console.log(a) //[3, 2, 3]

对数组b进行修改时,而a内数据也会随之改变。这种直接赋值的方式就是浅拷贝现象。

因为JavaScript存储对象都是存地址的,所以浅拷贝会导致 a 和b 指向同一块内存地址,当修改b中的数据时,由于a也指向此处,所以a的数据也就被“修改了”。

深拷贝例子及解析


var a = { name: "张山", age: 14 }
var b = { name: a.name, age: a.age }
b.name = "李四"
console.log(a, b)//{ name: '张山', age: 14 } { name: '李四', age: 14 }

可以看出,对数组b进行修改时,而a内数据不会随之改变。这种直接赋值的方式就是深拷贝现象。

因为深拷贝不会导致 a 和b 指向同一块内存地址,而是会另外创造一个一模一样的对象,新对象跟原对象不共享堆内存,所以修改b中的数据时,不会改变原对象a数据

形象总结

浅拷贝

a同学有一台笔记本电脑并且配置了触感舒爽的鼠标、按键响亮的机械键盘等。b同学没钱买电脑,但是又很想体验,所以先买了和a同学一样的鼠标键盘自个先看着爽。然后向a同学借电脑过来玩。a同学和b同学各自的鼠标键盘出了啥问题,两个人之间互不影响对方的使用。而对电脑的操作就是谁最后操作了电脑,电脑就是显示最后那个人的操作界面(数据修改)。

深拷贝
a同学有笔记本+全套装备,b同学羡慕不已,自己让a同学照着买了一整套一模一样的给自己,但是他们各自的使用电脑情况,取决于他们各自的操作,电脑之间互不影响(数据结果)。


文章作者: BiLiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BiLiang !
评论
  目录