js深拷贝和浅拷贝

一.如何区分深拷贝和浅拷贝
如果A复制了B,对B改变看看A是不是会改变,如果A也跟着改变就是浅复制,如果A不跟着改变就是深复制
举个🌰
![image](http://upload-images.jianshu.io/upload_images/10044574-ac1c08810a1a1785?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
修改了B但是A也会跟着改变

这里就引入了基本数据类型和引用数据类型
1.基本数据类型:
值存储在栈内存中,但我们复制的时候,会新开辟一个栈,A = B之后,改变B,A不会受影响,但是这不断深拷贝,因为基本数据类型谈不上深拷贝,深拷贝只存在复杂的引用数据类型
2.引用数据类型
名存在栈内存中,值存在堆内存中,在复制的时候,复制的是是指向堆内存的指针,所以两者的值指向一个地址,因此改变其中一个就会引起其他的值变化,所以要在堆内存里面开辟一个新的空间就成为深拷贝

二.slice到底是深复制还是浅复制


image

上面的b没有受a的影响,那么slice就是深复制啦😎
然而。。。。。😅


二级拷贝没有成功

所以slice不是真正的深拷贝
结构赋值也是浅拷贝

三.深克隆
在遇到函数、 undefined 或者 symbol 的时候,该对象也不能正常的序列化

let a = {
  age: undefined,
  sex: Symbol('male'),
  jobs: function() {},
  name: 'aaa'
}
let b = JSON.parse(JSON.stringify(a))
console.log(b) // {name: "aaa"}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容