1、简单递归,只处理了 object 类型和简单类型
const deepCopy = s => {
let r = {};
for (let key in s) {
r[key] = typeof s[key]=== 'object' ? deepCopy(s[key]): s[key];
}
return r;
}
const obj1 = { a : 1, b : 2, c: { cc: 1 }}
const obj2 = deepCopy(obj1)
obj1.c.cc = 2;
console.log(obj1); // { a : 1, b : 2, c: { cc: 2 }}
console.log(obj2); // { a : 1, b : 2, c: { cc: 1 }}
2、非递归
const getType = v => { // 只考虑数组和对象,其余都是简单值
return typeof v === 'object'
}
const deepCopy = s => {
let dest = {};
const arr = [[s, dest]]
// const set = new Set([])
while (arr.length) {
const { s, dest } = arr.shift()
for (let [k, v] of Object.entries(s)) {
if (getType(v)) {
// if (set.has(v)) {
// dest[k] = v
// continue
// }
dest[k] = {}
arr.push({
s: v,
dest: dest[k]
})
} else {
dest[k] = v
}
}
// set.add(s)
}
return dest
}
const obj1 = {
a: 1,
b: 2,
c: {
cc: {
cc: 123,
ccc2: 124,
},
cc2: {
ccc3: 'lalla'
}
}
}
const obj2 = deepCopy(obj1)
obj1.c.cc.ccc = 111;
console.log(obj1);
console.log(obj2);
3、json的形式,这种特殊类型好像有问题
// const b = [11, 12]
// const b = undefined;
// const b = null;
const obj1 = { a: 1, b: null, c: { cc: 1 } }
const obj2 = JSON.parse(JSON.stringify(obj1));
// obj1.a = 2;
console.log(obj1); // { a : 1, b : 2, c: { cc: 1 }}
console.log(obj2); // { a : 1, b : 2, c: { cc: 1 }}
4、jquery extend函数
const obj1 = { a : 1, b : 2, c: { cc1: 4, cc2: 5 }}
const obj2 = { e : 1, c: { cc1: 7 }}
const r1 = $.extend(true, obj1, obj2); // 深copy { a : 1, b : 2, e : 1, c: { cc1: 7, cc2: 5 }}
const r2 = $.extend(false, obj1, obj2); // 浅copy { a : 1, b : 2, e : 1, c: { cc1: 7}}