方法一:
const deepCopy = (obj) => {
if (obj === null || obj === undefined) {
return obj; // 或者可以根据需要返回其他值,如null
}
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) { // 确保只复制对象自身的属性
if (obj[key] instanceof Array) {
newObj[key] = deepCopy(obj[key])
} else if (obj[key] instanceof Object && obj[key] !== null) {
newObj[key] = deepCopy(obj[key])
} else {
newObj[key] = obj[key]
}
}
}
// 如果需要保留原型链,可以添加以下代码
// Object.setPrototypeOf(newObj, Object.getPrototypeOf(obj));
console.log(newObj)
return newObj
}
let data = {
name: '小明',
age: 18,
hobby: [{
id: 1,
text: 'aaa'
},
{
id: 2,
text: 'bbb'
}]
}
deepCopy(data)
方法二:
const deepCopy = (newObj,obj) => {
for(let key in obj) {
if (obj[key] instanceof Array) {
newObj[key] = []
deepCopy(newObj[key],obj[key])
} else if (obj[key] instanceof Object) {
newObj[key] = {}
deepCopy(newObj[key],obj[key])
} else{
newObj[key] = obj[key]
}
}
console.log(newObj)
}
let data = {
name: '小明',
age: 18,
hobby: [{
id: 1,
text: 'aaa'
},
{
id: 2,
text: 'bbb'
}]
}
deepCopy({},data)
方法三:
const deepCopy = (target) => {
if (typeof target === 'object') {
// 此处要先判断是否是数组,因为数组也属于对象
let cloneTarget = Array.isArray(target) ? [] : {};
for (const key in target) { // key 是属性名,target[key]是属性值
cloneTarget[key] = deepCopy(target[key]); // cloneTarget[key] 是创建属性名
}
console.log(cloneTarget,'cloneTarget====')
return cloneTarget;
} else {
return target;
}
};
let data = {
name: '小明',
age: 18,
hobby: [{
id: 1,
text: 'aaa'
},
{
id: 2,
text: 'bbb'
}]
}
deepCopy(data)
方法四:
// 深拷贝(相对完整版但也有很多特殊类型没包含,如: Blob,file,ArrayBuffer和TypedArray)
function deepCopy(obj, hash = new WeakMap()) {
// 如果obj是原始类型,直接返回
if (obj === null || typeof obj !== 'object') {
return obj;
}
// 如果obj已经在hash中,说明之前已经拷贝过,直接返回其拷贝的副本
if (hash.has(obj)) {
return hash.get(obj);
}
// 根据obj的类型创建一个新的实例
let cloneObj;
if (obj instanceof Array) {
cloneObj = [];
} else if (obj instanceof Date) {
cloneObj = new Date(obj);
} else if (obj instanceof RegExp) {
cloneObj = new RegExp(obj);
} else {
cloneObj = new obj.constructor;
}
// 将新对象存入hash,避免无限递归
hash.set(obj, cloneObj);
// 递归处理obj的所有属性
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloneObj[key] = deepCopy(obj[key], hash);
}
}
console.log(cloneObj,'clone========')
return cloneObj;
}
let data = {
name: '小明',
age: 18,
hobby: [{
id: 1,
text: 'aaa'
},
{
id: 2,
text: 'bbb'
}]
}
deepCopy(data)