Skip to content

手写 JS 深拷贝

浅拷贝和深拷贝

  • 浅拷贝,obj1 = obj2,改变 obj2 的值时,obj1 随之改变
  • 深拷贝,obj1 = deepClone(obj2) ,改变 obj2 的值时,obj1 不会改变
js
const obj1 = {
  age: 20,
  name: 'xxx',
  address: {
    city: 'beijing',
  },
  arr: ['a', 'b', 'c'],
};

深拷贝函数

  • 注意判断值类型和引用类型
  • 注意判断是数组还是对象
  • 递归
js
/**
 * 深拷贝
 * @param obj
 */
function deepClone(obj = {}) {
  if (typeof obj != 'object' || obj == null) {
    // 不是对象或者null,直接返回
    return obj;
  }
  let result;
  if (obj instanceof Array) {
    result = [];
  } else {
    result = {};
  }
  for (let key in obj) {
    // 保证 key 是自身属性而不是原型的属性
    if (obj.hasOwnProperty(key)) {
      //递归拷贝
      result[key] = deepClone(obj[key]);
    }
  }
  return result;
}

深拷贝通过 JSON 对象的 parse 和 stringify

js
function deepClone(obj) {
  let _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
  return objClone;
}

两种拷贝的区别

js
const obj2 = deepClone(obj1);
obj2.address.city = 'shanghai';
console.log(obj1.address.city); //beijing
const obj3 = obj1;
obj3.address.city = 'shenzhen';
console.log(obj1.address.city); //shenzhen

基于 MIT 许可发布