浅拷贝(Shallow Copy)
浅拷贝可以通过扩展运算符(...
)或者Object.assign()
方法来实现
javascript
function shallowCopy(obj) {
if(typeof obj !== 'object' || obj === null) {
return obj;
}
return Object.assign({},obj);
}
const original = {a: 1, b: {c: 2}};
const copied = shallowCopy(original);
console.log(copied); // {a: 1, b: {c: 2}}
深拷贝(Deep Copy)
javascript
function deepCopy(obj, hash = new WeakMap()) {
if(typeof obj !== 'object' || obj === null) return obj;
if(obj instanceof Date) return new Date(obj);
if(obj instanceof RegExp) return new RegExp(obj);
//如果hash中有这个对象,则直接返回hash中储存的对象引用
if(hash.has(obj)) {
return hash.get(obj);
}
let newObj = Array.isArray(obj)
hash.set(obj,newObj);
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key],hash);
}
}
return newObj;
}
const original = {a: 1, b: {c: 2}};
const copide = deepCopy(original);
console.log(copied); // { a: 1, b: { c: 2 } }
console.log(original === copied); // false
console.log(original.b === copied.b); // false
这个深拷贝函数还使用了WeakMap
来存储已经复制过的对象,以避免无限递归和循环引用的问题。如果对象中存在循环引用,即某个对象的属性直接或间接地引用了该对象本身,使用WeakMap
可以有效地避免这个问题。