深拷贝:增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
1.递归递归去复制
function deepCopyTwo(obj) { let objClone = Array.isArray(obj) ? [] : {}; if (obj && typeof obj == 'object') { for (const key in obj) { //判断obj子元素是否为对象,如果是,递归复制 if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepCopyTwo(obj[key]); } else { //如果不是,简单复制(针对数组) objClone[key] = obj[key]; } } } return objClone; }
let a=[1,22,32,4],
b=deepClone(a);
a[0]=2;
console.log(a); //[2, 22, 32, 4]
console.log(b); //[1, 22, 32, 4]
2、JSON.parse(JSON.stringify(o))
function deepCopy(o) { return JSON.parse(JSON.stringify(o)) } var c = { age: 1, name: undefined, sex: null, tel: /^1[34578]d{9}$/, say: () => { console.log('hahha') } } // { age: 1, sex: null, tel: {} }
需要注意的是:这种拷贝方法不可以拷贝一些特殊的属性(例如正则表达式,undefine,function)
浅拷贝:是增加了一个指针指向已存在的内存地址
1、= 复制
let a=[0,1,2,3,4],b=a; console.log(a===b); //true a[0]=1; console.log(a); //[1, 1, 2, 3, 4] console.log(b) //[1, 1, 2, 3, 4]
2、object.assign(target,source)