js 深拷贝与浅拷贝
深拷贝与浅拷贝的区别,实现深拷贝的几种方法是面试必问考点
区分两者很容易,简单的来说,假设 b 复制了 a,当修改 a 的值时,b 的值也发生变化,这就是浅拷贝
如果 b 没有发生改变就是深拷贝
浅拷贝例子
1 | let A = [0, 1, 2, 3]; |
基本数据类型与引用数据类型
1 基本类型–名值存储在栈内存中 let a =1
当 b=a 复制时,栈内存会重新开辟一个内存
所以此时修改 a=2,对 b 并不会造成影响
2 引用数据类型–名存在栈内存中,值存在于堆内存中
当 b=a 进行拷贝时,其实复制的是 a 的引用地址,而并非堆里面的值。
当我们 a[0]=1 时进行数组修改时,由于 a 与 b 指向的是同一个地址,所以自然 b 也受了影响,这就是所谓的浅拷贝了。
要是在堆内存中也开辟一个新的内存专门为 b 存放值,就像基本类型那样就达到深拷贝效果
深拷贝方法
使用递归的方式实现深拷贝
1 | function deepClone(obj) { |
跟预想的一样,现在 b 脱离了 a 的控制,不再受 a 影响了
通过 JSON 对象实现深拷贝
缺点:
JSON 对象实现深拷贝的一些问题.无法实现对对象中方法的深拷贝
1 | function deepClone2(obj) { |
通过 Object.assign()拷贝
缺点:
当对象只有一级属性为深拷贝;
当对象中有多级属性时,二级属性后就是浅拷贝
1 | let obj = { |