JS对象复制的方式

144 阅读1分钟

浅拷贝

1.解构...

let obj = {
    a: 1,
    b: 2,
  };
let objCopy = {...obj}
console.log(objCopy);
// Result - { a: 1, b: 2 }

2.Object.assign(newobj, obj)

let obj = {
    a: 1,
    b: 2,
  };
let objCopy = Object.assign({}, obj);
console.log(objCopy);
// Result - { a: 1, b: 2 }

深拷贝

1. JSON.stringify 转字符串

JSON.parse(JSON.stringify(obj))

缺点:function 不能复制

2.lodash.deepClone()

3.自定义deepClone()

function deepClone(target) {
    let newObj; // 定义一个变量,准备接新副本对象
    // 如果当前需要深拷贝的是一个引用类型对象
    if (typeof target === 'object') {
        if (Array.isArray(target)) { // 如果是一个数组
            newObj = []; // 将newObj赋值为一个数组,并遍历
            for (let i in target) { // 递归克隆数组中的每一项
                newObj.push(deepClone(target[i]))
            }
            // 判断如果当前的值是null;直接赋值为null
        } else if (target === null) {
            newObj = null;
            // 判断如果当前的值是一个正则表达式对象,直接赋值
        } else if (target.constructor === RegExp) {
            newObj = target;
        } else {
            // 否则是普通对象,直接for in循环递归遍历复制对象中每个属性值
            newObj = {};
            for (let i in target) {
                newObj[i] = deepClone(target[i]);
            }
        }
        // 如果不是对象而是原始数据类型,那么直接赋值
    } else {
        newObj = target;
    }
    // 返回最终结果 return newObj; 
}