返回

JS浅浅说:浅拷贝和深拷贝

前端

浅拷贝与深拷贝的概念

浅拷贝和深拷贝是JavaScript中处理引用类型数据的重要概念。简单来说,浅拷贝是指只复制对象的第一层属性,而深拷贝则是复制对象的所有属性,包括嵌套的对象。

浅拷贝实现

内置函数

JavaScript 中有许多内置函数可以实现浅拷贝,比如 Object.assign()spread 操作符 (...)。

  • Object.assign()
const obj1 = { name: 'John Doe' };
const obj2 = Object.assign({}, obj1);
  • spread 操作符 (...):
const obj1 = { name: 'John Doe' };
const obj2 = { ...obj1 };

手写浅拷贝

手写浅拷贝需要手动遍历对象的所有属性,并将其复制到新的对象中。

function shallowCopy(obj) {
  const newObj = {};
  for (const key in obj) {
    newObj[key] = obj[key];
  }
  return newObj;
}

深拷贝实现

递归实现

实现深拷贝的一种方法是使用递归。递归函数将遍历对象的所有属性,并将其复制到新的对象中。

function deepCopy(obj) {
  const newObj = {};
  for (const key in obj) {
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      newObj[key] = deepCopy(obj[key]);
    } else {
      newObj[key] = obj[key];
    }
  }
  return newObj;
}

JSON.parse 和 JSON.stringify

也可以使用 JSON.parse()JSON.stringify() 实现深拷贝,但需要注意的是,这会导致对象中某些属性值丢失。

const obj1 = { name: 'John Doe', dob: new Date() };
const obj2 = JSON.parse(JSON.stringify(obj1));

何时使用浅拷贝和深拷贝

浅拷贝和深拷贝各有其适用场景。一般来说,当我们只需要复制对象的第一层属性时,就可以使用浅拷贝。而当我们需要复制对象的所有属性,包括嵌套的对象时,就需要使用深拷贝。

总结

在本文中,我们介绍了JavaScript中的浅拷贝和深拷贝的概念,以及如何实现它们。希望这些信息对您有所帮助。如果您有其他问题,请随时与我们联系。