基本类型(值类型)没有指向空间地址,所以基本类型没有深度浅度克隆之说,引用类型才有深度浅度克隆之说
1.引用类型基于json字符进行深度克隆
let obj1 = {name:'fuheng'}
let obj2 = JSON.parse(JSON.stringify(obj1))
console.log(obj1 === obj2);
obj2.name='fuyi';
console.log(obj1);
let arr1=[1,2,3,{name:'fuarr'}]
let arr2 = JSON.parse(JSON.stringify(arr1))
arr2[3].name='fuNewArray';
console.log(arr1[3].name);
2.基于Object.prototype.toString.call(obj)判断数据类型,进行递归赋值
function getObjClass(obj) {
let result = Object.prototype.toString.call(obj).slice(8, -1);
if (result === 'Null') {
return 'Null';
} else if (result === 'Undefined') {
return 'Undefined';
} else {
return result;
}
}
function deepClone(obj) {
let result, objType = getObjClass(obj);
if (objType === 'Object') {
result = {};
} else if (objType === 'Array') {
result = [];
} else {
return obj;
}
for (let key in obj) {
let value = obj[key];
if (getObjClass(value) === "Object" || getObjClass(value) === 'Array') {
result[key] = deepClone(value);
} else {
result[key] = obj[key];
}
}
return result;
}
let obj3 = {username: 'fuheng',age: 18, sex: {option1: '男', option2: '女'}};
let obj4 = deepClone(obj3);
console.log(obj4 === obj3);
obj4.sex.option1 = '不男不女';
console.log(obj4);
console.log(obj3);