数组、对象的深拷贝

75 阅读2分钟

js数据类型

基本类型: number、boolean、string、null、undefined、symbol

引用类型: Array、Object、函数

基本类型的变量和值都存放在栈内存中

引用类型的变量名存放在栈内存中,值存放在堆内存中,栈内存会提供一个引用的地址指向堆内存中的值,进行拷贝时,拷贝的是引用的地址和拷贝前指向同一个堆内存,并非是堆内存中的值,所以拷贝前和拷贝后的其中一个修改了数据值,拷贝前和拷贝后的值都会受到影响

深拷贝的实现

方法一: JSON.parse、JSON.stringify

let obj = {a:123, b:444, c:2222};
let objClone = JSON.parse(JSON.stringify(obj));

let arr = [1,2,[3,4],5,6];
let arrClone = JSON.parse(JSON.stringify(arr));

方法二: Object.assign()

注: 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝

let obj = {a:123, b:444, c:2222};
let objClone = Object.assign(obj); //深拷贝


let obj = {a:123, b:444, c:2222, d:{e:11,f:123}};
let objClone = Object.assign(obj); //浅拷贝

方法三: 循环拷贝

objDeepCopy(source) {
  let sourceCopy = source instanceof Array ? [] : {};
  for (let item in source) {
    sourceCopy[item] = typeof source[item] === "object" ? this.objDeepCopy(source[item]) : source[item];
  }
  return sourceCopy;
}

let obj = {a:123, b:444, c:2222, d:{e:11,f:123}};
let objClone = objDeepCopy(obj);

let arr = [1,2,[3,4],5,6];
let arrClone = objDeepCopy(arr);

方法四: ES6数据扩展

注: 当对象/数组中只有一级,没有二级的时候,此方法为深拷贝,但是对象/数组中有对象/数组的时候,此方法,在二级以后就是浅拷贝

let obj = {a:123, b:444, c:2222, d:{e:11,f:123}};
let objClone = {...obj};//浅拷贝

let arr = [1,2,[3,4],5,6];
let arrClone = [...arr];//浅拷贝

let obj = {a:123, b:444, c:2222};
let objClone = {...obj}; //深拷贝