浅拷贝
拷贝基本数据类型时 直接拷贝基本数据类型的值 拷贝引用类型时,拷贝的是内存地址,就是拷贝后的内容与原始内容指向同一个内存地址
常见的浅拷贝方法有以下几种
- 使用Object.assign()方法,将原始对象的属性浅拷贝到目标对象中。例如:
JavaScript
const obj = {a: 1, b: {c: 2}};
const newObj = Object.assign({}, obj);
- 使用扩展运算符(…)将对象浅拷贝到新对象中。例如:
JavaScript
const obj = {a: 1, b: {c: 2}};
const newObj = {...obj};
- 使用Array.prototype.slice()方法将数组浅拷贝到新数组中。例如:
JavaScript
const arr = [1, 2, [3, 4]];
const newArr = arr.slice();
深拷贝
从内存中完整的拷贝一份,并且会在堆内存中开辟一个新的区域存放, 拷贝出来的新对象和原始对象互相独立,互不影响
常见的深拷贝方法有以下几种
使用JSON序列化与反序列化
- **JSON.stringify() 将对象转化为字符串
- JSON.parse() 将字符串转为对象**
递归遍历对象,创建新的对象
面经
如果我有一个对象数组A,想生成一个B的对象数组,把A赋值给了B,当我改变了B的话A会改变吗,为什么?(其实就是深浅拷贝问题)
1.会改变 2.当你将对象数组A赋值给B,实际上将A的内存地址的索引赋值给了B.A和B实际上同指向一块内存地址,引用的是同一个对象 3.当你修改B时,实际上是在修改对象本身, AB同指向一个对象所以A也会改变,
ES6中有个拷贝的方法,你知道那个方法吗?你还知道其他哪些方法? ES6中的拷贝方法为Object.assign,它是一个浅拷贝的使用