Skip to content

浅拷贝(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可以有效地避免这个问题。