深拷贝和浅拷贝,都只针对引用类型的数据
- 浅拷贝:指的就是引用类型的数据,在拷贝过程中,只要内部有一条数据的地址没有更换,就属于浅拷贝
- 深拷贝:指的就是引用类型的数据,在拷贝过程中,所有的引用数据都更换了新的地址,就属于深拷贝
一、浅拷贝的常用方法
1、扩展运算符
扩展运算符,可以用来更换引用类型数据最外层的地址。const arr = [1, 2, 3];const newArr = [...arr];const obj = { a: 1, b: 2 };const newObj = { ...obj };
2、Object.assign()
const obj = { a: 1, b: 2 }const newObj = Object.assign({}, obj);
二、深拷贝的常用方法
1、JSON 对象的方法
缺点:JSON 的方法不能处理数据中的 undefined 和 function。const obj = { a: 1, b: 2, c: { d: 3 } }const str = JSON.stringify(obj);const newObj = JSON.parse(str);obj.c.d = 4;console.log(newObj);
2、封装递归的函数
function deepClone (data) {// 先判断传入的data是否为 object ,否则直接return dataif (typeof (data) === "object") {// 定义新对象,用于存放深拷贝后的对象const newData = {}// 遍历传入的对象for (const key in data) {// 如果传入的data里面还嵌套了对象,就需要使用递归一直循环进入ifnewData[key] = deepClone(data[key])}return newData}return data}const newObj = deepClone(obj)const obj = {a: 1, b: 2, c: { d: 3 }}obj.c.d = 4;console.log(obj, newObj); // {a: 1, b: 2, c: {d: 4}} {a: 1, b: 2, c: {d: 3}}console.log(obj === newObj); // false
