- JSON.parse(JSON.Stringfy(target))
- es5的循环递归
function deepClone(origin, target) {
target = target || {};
let array = '[object Array]',
toStr = Object.prototype.toString;
for (let k in origin) {
if (origin.hasOwnProperty(k)) {
if (typeof target === 'object' && target !== null) {
target[k] = (toStr.call(origin[k]) === array) ? [] : {}
deepClone(target[k], origin[k])
} else {
target[k] = origin[k]
}
}
}
return target
}
- es6的循环递归
const origin = {
name: '胖达',
age: 13,
born: new Date(),
hobby: {
eat: ['冰淇淋', '汉堡', '阔洛', '薯条'],
sleep: '深度睡眠',
sports: {
ball: {
ball1: '篮球',
ball2: '羽毛球'
},
jump: ['调高', '跳绳']
}
}
}
function deepClone(origin, hashMap = new WeakMap()) {
if (origin === undefined || typeof origin !== 'object') {
return origin
}
if (origin instanceof Date) {
return new Date(origin)
}
if (origin instanceof RegExp) {
return new RegExp(origin)
}
let hashKey = hashMap.get(origin);
console.log('hask', hashKey)
if (hashKey) {
return hashKey
}
let target = new origin.constructor();
hashMap.set(origin, target)
for (let k in origin) {
if (origin.hasOwnProperty(k)) {
target[k] = deepClone(origin[k], hashMap)
}
}
return target
}
let target = deepClone(origin)
origin.hobby.eat.push('螺狮粉')
target.hobby.sports.ball.ball3 = '乒乓球'
console.log('target-', target)
console.log('origin-', origin)
let t1 = {},
t2 = {};
t1.t2 = t2;
t2.t1 = t1;
let t3 = deepClone(t1)
console.log(999, t3)