Skip to content

深拷贝浅拷贝

浅拷贝

  • Object.assign
  • Array.concat
  • Array.slice
  • 扩展运算符

深拷贝

  • JSON.parse(JSON.stringify())
  • 递归
  • lodash.cloneDeep
  • jQuery.extend(true, {}, obj)

实现深拷贝

简单实现:

js
function deepCopy(obj) {
    if (typeof obj !== 'object' || obj == null ) return obj;
    let newObj = obj instanceof Array ? [] : {};
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}

考虑循环引用:

js
function deepClone(obj, hash = new WeakMap()) {
    if (obj === null) return obj;
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);
    if (typeof obj !== "object") return obj;
    if (hash.get(obj)) return hash.get(obj);
    let cloneObj = new obj.constructor();
    hash.set(obj, cloneObj);
    
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            cloneObj[key] = deepClone(obj[key], hash);
        }
    }
    
    return cloneObj;
}