js深拷贝和浅拷贝

2018-06-15  本文已影响0人  野蛮生长_ed2e

一.如何区分深拷贝和浅拷贝
如果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"}
上一篇 下一篇

猜你喜欢

热点阅读