一.如何区分深拷贝和浅拷贝
如果A复制了B,对B改变看看A是不是会改变,如果A也跟着改变就是浅复制,如果A不跟着改变就是深复制
举个🌰
![image](https://img.haomeiwen.com/i10044574/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"}
网友评论