对象深拷贝的三种方法
A1:JSON方法实现
//_tmp和result是相互独立的,没有任何联系,有各自的存储空间。
let deepClone = function (obj) {
let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式
let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象
return result;
};
let obj1 = {
weiqiujaun: {
age: 20,
class: 1502
}
};
deepClone(obj1);
A2:用for…in实现遍历和复制
// 定义拷贝方法
function deepClone(obj) {
let result = typeof obj.splice === "function" ? [] : {};
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj[key] && typeof obj[key] === 'object') {
//如果对象的属性值为object的时候,递归调用deepClone
result[key] = deepClone(obj[key]);
} else {
//如果对象的属性值不为object的时候
result[key] = obj[key];
}
}
return result;
}
return obj;
}
// 定义对象
let testArray = ["a", "b", "c", "d"];
let testObj = {
sex: "girl",
age: 22,
family: {brother: "wei"}
}
// 调用拷贝方法
deepClone(testArray);
deepClone(testObj);
A3:利用数组的Array.prototype.forEach进copy
相关api:Object.getOwnPropertyDescriptor()、Object.getOwnPropertyNames()
let deepClone = function (obj) {
let copy = Object.create(Object.getPrototypeOf(obj));
let propNames = Object.getOwnPropertyNames(obj);
propNames.forEach(function (items) {
let item = Object.getOwnPropertyDescriptor(obj, items);
Object.defineProperty(copy, items, item);
});
return copy;
};
let testObj = {
sex: "girl",
age: 22,
family: {brother: "wei"}
}
deepClone(testObj);
对象浅拷贝方法
使用object.assign方法
let target=[];
let testArr=[2,3,5,8];
Object.assign(target,testArr);
console.log(target);
testArr.push(8);
console.log("我是原来的"+target+",我是现在的"+testArr);
[
](https://blog.csdn.net/qq_39083004/article/details/80206336)
函数拷贝方法
function targets () {
return { a : 2 }
}
const copys = new Function('return '+ targets.toString())()