手写深拷贝(下:简约多版本)

63 阅读1分钟

//写一个深拷贝

  1. 递归
  2. 循环
  3. 递归 + 循环
  4. JSON.parse(JSON.stringify(obj))
  1. 递归
function deepClone(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }
    let newObj = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = deepClone(obj[key]);
        }
    }
    return newObj;
}
  1. 循环
function deepClone(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }
    let newObj = Array.isArray(obj) ? [] : {};
    let queue = [obj];
    while (queue.length) {
        let temp = queue.shift();
        for (let key in temp) {
            if (temp.hasOwnProperty(key)) {
                if (typeof temp[key] !== 'object' || temp[key] === null) {
                    newObj[key] = temp[key];
                } else {
                    newObj[key] = Array.isArray(temp[key]) ? [] : {};
                    queue.push(temp[key]);
                }
            }
        }
    }
    return newObj;
}
  1. 递归 + 循环
function deepClone(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj;
    }
    let newObj = Array.isArray(obj) ? [] : {};
    let queue = [obj];
    let map = new Map();
    while (queue.length) {
        let temp = queue.shift();
        if (map.has(temp)) {
            return map.get(temp);
        }
        map.set(temp, newObj);
        for (let key in temp) {
            if (temp.hasOwnProperty(key)) {
                if (typeof temp[key] !== 'object' || temp[key] === null) {
                    newObj[key] = temp[key];
                } else {
                    newObj[key] = Array.isArray(temp[key]) ? [] : {};
                    queue.push(temp[key]);
                }
            }
        }
    }
    return newObj;
}
  1. JSON.parse(JSON.stringify(obj))
  • 会忽略 undefined、symbol、函数
  • 不能序列化正则
  • 不能解决循环引用的对象
function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
}