怎么做深拷贝?

简介: 怎么做深拷贝?

深拷贝是指在拷贝对象时,不仅拷贝了对象本身,还拷贝了对象内部所有的嵌套对象,确保拷贝后的对象与原始对象完全独立,互不影响。在 JavaScript 中,可以通过以下方法来实现深拷贝:

  1. 使用 JSON 序列化和反序列化:
const deepCopy = (obj) => {
  return JSON.parse(JSON.stringify(obj));
};
// 使用方法
const originalObj = { a: 1, b: { c: 2 } };
const copiedObj = deepCopy(originalObj);
  1. 这种方法简单易行,但有一些局限性,比如无法拷贝函数、正则表达式、循环引用等特殊对象。
  2. 递归遍历对象并拷贝:
const deepCopy = (obj) => {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  const newObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      newObj[key] = deepCopy(obj[key]);
    }
  }
  return newObj;
};
// 使用方法
const originalObj = { a: 1, b: { c: 2 } };
const copiedObj = deepCopy(originalObj);
  1. 这种方法需要递归地遍历对象的所有属性,并进行拷贝,可以处理更多类型的数据,但需要注意处理循环引用的情况,以避免进入死循环。
  2. 无论使用哪种方法,深拷贝都需要考虑到各种复杂的数据类型和边界情况,以确保拷贝的对象完全独立于原始对象。
相关文章
|
2月前
|
JSON 前端开发 JavaScript
面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?
面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?
|
3天前
|
前端开发 JavaScript
前端深拷贝、浅拷贝,一起手撕深拷贝
【7月更文挑战第2天】JavaScript中的深拷贝和浅拷贝关乎对象复制的独立性。浅拷贝(如`Object.assign()`、扩展运算符)创建新对象,但共享引用类型属性的内存地址,导致修改新对象会影响原始对象。深拷贝(如递归复制)创建完全独立的对象副本,不受原始对象变动影响。`JSON.parse(JSON.stringify(obj))`是简单的深拷贝方法,但无法处理函数、undefined、Symbol及循环引用。手动实现深拷贝需递归遍历并处理循环引用问题,以确保复制的完整性。理解这两者差异对编写健壮的代码至关重要。
6 0
|
1月前
|
JavaScript JSON 前端开发
深/浅拷贝,有哪些实现方式
深/浅拷贝,有哪些实现方式
|
2月前
|
存储 Java Apache
【面试问题】深拷贝和浅拷贝的区别?
【1月更文挑战第27天】【面试问题】深拷贝和浅拷贝的区别?
|
12月前
面试官:深拷贝与浅拷贝有啥区别?
面试官:深拷贝与浅拷贝有啥区别?
|
8月前
|
JavaScript
一文弄懂浅拷贝和深拷贝
一文弄懂浅拷贝和深拷贝
33 0
|
11月前
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
66 0
|
人工智能 JavaScript 前端开发
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
首先我们要明白一点,js中数据类型分为: 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol) 对象数据类型 ( Object )** 引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体
80 0
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
|
存储 JSON 缓存
前端面试:浅拷贝和深拷贝的区别?
前端面试:浅拷贝和深拷贝的区别?
|
JSON JavaScript 前端开发
【面试官系列】请讲讲你知道的关于对象和数组深、浅拷贝的一些技巧 ~(一)
【面试官系列】请讲讲你知道的关于对象和数组深、浅拷贝的一些技巧 ~(一)