JavaScript知识 - 深拷贝浅拷贝
JavaScript资料整理
深浅拷贝
letet a a = { |
- 从上述例子中我们可以发现,如果给一个变量赋值一个对象,那么两者的值会是同一个引用,其中一方改变,另一方也会相应改变。
- 通常在开发中我们不希望出现这样的问题,我们可以使用浅拷贝来解决这个问题
浅拷贝
首先可以通过
Object.assign
来解决这个问题
let a = { |
当然我们也可以通过展开运算符
(…)
来解决
let a = { |
通常浅拷贝就能解决大部分问题了,但是当我们遇到如下情况就需要使用到深拷贝了
let a = { |
浅拷贝只解决了第一层的问题,如果接下去的值中还有对象的话,那么就又回到刚开始的话题了,两者享有相同的引用。要解决这个问题,我们需要引入深拷
深拷贝
这个问题通常可以通过
JSON.parse(JSON.stringify(object))
来解决
let a = { |
但是该方法也是有局限性的:
- 会忽略
undefined
- 不能序列化函数
- 不能解决循环引用的对象
let obj = { |
如果你有这么一个循环引用对象,你会发现你不能通过该方法深拷贝
- 在遇到函数或者
undefined
的时候,该对象也不能正常的序列化
let a = { |
- 你会发现在上述情况中,该方法会忽略掉函数和`undefined。
- 但是在通常情况下,复杂数据都是可以序列化的,所以这个函数可以解决大部分问题,并且该函数是内置函数中处理深拷贝性能最快的。当然如果你的数据中含有以上三种情况下,可以使用
lodash
的深拷贝函数。