千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  千锋问问  > JS实现深拷贝复制的方法有哪些

JS实现深拷贝复制的方法有哪些

匿名提问者 2023-03-14 16:26:00

JS实现深拷贝复制的方法有哪些

我要提问

推荐答案

  实现深拷贝有多种方式,这里提供几种常见的方法:

  方法一:递归复制

  递归复制是一种简单但是常用的深拷贝实现方式。基本思路是遍历对象的每个属性,如果属性值是一个对象,则递归调用该方法进行复制。

  function deepClone(obj) {

  // 判断是否是引用类型

  if (typeof obj !== 'object' || obj === null) {

  return obj;

  }

  let result;

  if (Array.isArray(obj)) {

  result = [];

  for (let i = 0; i < obj.length; i++) {

  result.push(deepClone(obj[i]));

  }

  } else {

  result = {};

  for (let key in obj) {

  result[key] = deepClone(obj[key]);

  }

  }

  return result;

  }

JS实现深拷贝复制的方法

  方法二:使用 JSON 对象

  如果数据不包含函数、循环引用等特殊情况,可以使用 JSON 对象的 stringify 和 parse 方法来实现深拷贝。该方法的基本思路是将对象序列化为 JSON 字符串,再将 JSON 字符串反序列化为新的对象。

  function deepClone(obj) {

  return JSON.parse(JSON.stringify(obj));

  }

  需要注意的是,该方法不能正确处理函数、循环引用等特殊情况。

  方法三:使用第三方库

  如果项目中使用了第三方库,可以使用该库提供的深拷贝方法,如 Lodash 库提供的 cloneDeep 方法。

  const _ = require('lodash');

  const obj = { a: 1, b: { c: 2 } };

  const clonedObj = _.cloneDeep(obj);

  使用第三方库的优点是不需要自己实现深拷贝方法,可以直接调用现成的方法。但是需要注意库的引入和使用方法。

其他答案

  •   进行深拷贝的方法:递归函数 (推荐使用,项目中使用的更多,更小,更安全)JSON.stringify() 和JSON.parse() ; (不推荐使用,如果遇到Function,Date等类型的变量容易出现一些意料之外的问题),第三方库lodash的cloneDeep()方法 (就情况而定,如果项目中原先就有lodash这个第三方库,可以使用,否则还是推荐使用递归函数。不然成本太高。),JQuery的extend()函数 (推荐在JQuery项目中使用,其他项目依然推荐是用递归函数)

  •   JavaScript中的对象赋值操作是浅拷贝,即当使用赋值操作符(=)将一个对象赋值给另一个对象时,实际上是将它们的引用指向了同一个对象。如果修改其中一个对象的属性,另一个对象的属性也会随之改变,为了避免这种情况,可以使用深拷贝复制一个对象,即将一个对象及其所有属性的副本复制到一个新对象中。