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}; //深拷贝