深拷贝
// 手写实现一个深拷贝
function deepClone(obj) {
// 判断是不是一个对象
function isObject(obj) {
return typeof obj === 'object' && obj !== null;
}
// 如果不是一个对象,抛出异常
if(!isObject(obj)) {
throw new Error("拷贝的数据不是一个对象")
}
// 判断是数组还是对象,创建对应的拷贝初始对象
let newObject = Array.isArray(obj) ? [] : {}
Object.keys(obj).map(key => {
newObject[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key]
})
return newObject
}
const d = Symbol('d')
let obj = {
a: 111,
b: [3,2, {z: {k: 1}}],
c: {k: 2},
d: {o: 3}
}
let newobj = {...obj}
// console.log('obj:', obj); // obj: { a: 111, b: [ 3, 2, { z: [Object] } ], c: { k: 3 } }
// console.log('newobj:', newobj); // newobj: { a: 111, b: [ 3, 2, { z: [Object] } ], c: { k: 3 } }
let newobj2 = deepClone(obj)
newobj2.c.k = 3
newobj2.d.o = 11
console.log('obj:', obj);
console.log('newobj2:', newobj2);
网友评论