浅拷贝:创建一个新对象,如果属性是基本类型,拷贝的就是基本类型的值,如果属性时引用类型的值,拷贝的就是内存你地址,如果其中一个改变了另一个也会改变。
深拷贝:将一个对象从内存中完整的拷贝出来一份,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

实现浅拷贝的方法

  • for···in只循环第一层
  • Object.assign方法
  • 直接用=赋值
  • 拓展运算符

    实现深拷贝的方法

    JSON.parse(JSON.stringify())

  • 如果obj里有时间对象,时间将以字符串的形式展示,而不是时间对象

  • 如果obj里有RegExp、Error对象,结果将只得到空对象
  • 如果obj里有函数,undefined,结果会把函数或 undefined丢失
  • 如果obj里有NaN、Infinity和-Infinity,结果会变成null

递归

  1. function deepClone(obj) {
  2. if (obj === null) return null;
  3. if (typeof obj !== "object") return obj;
  4. if (obj instanceof RegExp) return new RegExp(obj);
  5. if (obj instanceof Date) return new Date(obj);
  6. let result = new obj.constructor();
  7. for (let key in obj) {
  8. if (obj.hasOwnProperty(key)) {
  9. result[key] = deepClone(obj[key]);
  10. }
  11. }
  12. return result;
  13. }