浅拷贝

可以通过Object.assign来实现,对于一个对象类的引用(如ObjectArray),则会直接使用引用

let a = {
    val1: 1,
    obj: {
        val2: 2019
    }
};
let b = Object.assign({}, a);
a.val1 = 2;
a.obj.val2 = 2020;
console.log(b.val1); // 1
console.log(b.obj.val2); // 2020

当然了,我们也可以用 ES6 的解构语法实现浅拷贝

let a = {
    val1: 1,
    obj: {
        val2: 2019
    }
};
let b = { ...a };
a.val1 = 2;
a.obj.val2 = 2020;
console.log(b.val1); // 1
console.log(b.obj.val2); // 2020


深拷贝

深拷贝目前没有直接可用的方法,但是我们可以通过JSON序列化后再反序列化简单的实现

let a = {
    val1: 1,
    obj: {
        val2: 2019
    }
};
let b = JSON.parse(JSON.stringify(a));
a.val1 = 2;
a.obj.val2 = 2020;
console.log(b.val1); // 1
console.log(b.obj.val2); // 2019

但是实际上它也是有一定的缺点的:

  1. 会忽略 undefined
  2. 会忽略 symbol
  3. 不能序列化函数
  4. 不能解决循环引用的对象

主要是这些类型不能被正常的序列化,在执行JSON.stringify时会报错,因此推荐使用 lodash的函数 实现深拷贝