Skip to content
本页目录

浅拷贝

拷贝基本数据类型时 直接拷贝基本数据类型的值 拷贝引用类型时,拷贝的是内存地址,就是拷贝后的内容与原始内容指向同一个内存地址

常见的浅拷贝方法有以下几种

  • 使用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,它是一个浅拷贝的使用