JavaScript递归实现深拷贝

深浅拷贝:

深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而
深拷贝是层层拷贝。
深拷贝 复制地址的内容。就是说递归的复制内部数据找到基本数据类型之后才复制出来
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变
量后,再复制。浅拷贝拷贝的存贮在栈内存
深拷贝后的对象与原来的对象是完全隔离的,互不影响,
对一个对象的修改并不会影响另一个对象,深拷贝存储在堆内存。
浅拷贝:只是复制外层地址的拷贝 ,没有继续往内部找基本数据类型。
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值
是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。 可 以 使 用 Json.stirfy。JSON.parse ,(缺点:不能复制函数)forin、 Object.assign、 扩 展 运 算 符 … 、A rray.prototype.slice()、Array,递归等来实现深拷贝。
**基本数据类型:**不能添加属性和方法
**对象数据类型:**可以添加属性和方法

递归方式实现深拷贝
function copy(arr) {
  var newObj;
  // 实例化
  // 先检测他的数据类型  
  // 初始化 让他是对象或者数组
  newObj = arr instanceof Array ? [] : {}
  // 数组和对象都可以用for in循环 
  // for in 循环的是key for of 循环的是value
  // 但是有一个缺点就是说  
  //在我们数组的原型上他也会遍历  之遍历对象自身的属性 不便利原型链的属性用hasownproperty
  for (var key in arr) {
    if (arr.hasOwnProperty(key)) {
      typeof arr[key] == 'object' ? copy(arr[key]) : arr[key]

    }

  }

  // 返回的最终结果就是我们实现深拷贝之后的结果
  return newObj;

}
var arr = [{
    id: 1004,
    name: "jack",
    age: '22'
  },
  {
    id: 1002,
    name: "alice",
    age: '2162'
  },

  {
    id: 1003,
    name: "haha",
    age: '2232'
  },


]
var result = copy(arr);
### 使用递归实现深拷贝的方法 在 JavaScript 中,深拷贝是一种重要的技术手段,尤其适用于复杂的嵌套数据结构。以下是通过递归方法实现深拷贝的关键点以及完整的代码示例。 #### 关键点分析 1. **区分基本类型和引用类型** 在递归过程中,首先要判断当前处理的数据是基本类型还是引用类型。如果是一个基本类型,则直接返回其值;如果是引用类型(如对象或数组),则需要进一步深入递归处理[^5]。 2. **检测循环引用** 如果不注意,递归可能陷入无限循环,尤其是在存在环状引用的情况下。因此,可以通过维护一个已访问对象的集合来避免重复操作同一对象实例[^3]。 3. **分别处理对象和数组** 对于不同的引用类型(如 `Array` 和普通对象 `{}`),应采取适当的方式进行克隆。通常可以利用 `instanceof Array` 或者其他类型的检测工具来进行分支处理。 --- ### 示例代码 以下是一段基于上述原理的手写深拷贝函数: ```javascript function deepClone(obj, visited = new WeakMap()) { // 判断是否为null或者不是object类型 if (obj === null || typeof obj !== 'object') { return obj; } // 检查是否存在循环引用 if (visited.has(obj)) { return visited.get(obj); } // 创建新容器 const cloneObj = Array.isArray(obj) ? [] : {}; // 将当前对象标记为已访问 visited.set(obj, cloneObj); // 遍历并递归复制每一个属性 for (let key in obj) { if (obj.hasOwnProperty(key)) { // 确保只遍历自身的可枚举属性 cloneObj[key] = deepClone(obj[key], visited); // 递归调用 } } return cloneObj; } ``` 此代码实现了以下几个功能: - 支持基础类型和复杂嵌套结构的深拷贝。 - 能够有效防止因循环引用而导致的栈溢出错误。 - 提供了一个简单的接口以便开发者轻松调用该方法。 --- ### 应用场景举例 假设有一个包含多层嵌套的对象如下所示: ```javascript const originalObject = { name: "Alice", hobbies: ["reading", "swimming"], details: { age: 25, address: { city: "New York" } } }; // 进行深拷贝 const clonedObject = deepClone(originalObject); console.log(clonedObject.details.address.city); // 输出:"New York" clonedObject.hobbies.push("coding"); console.log(originalObject.hobbies.length); // 输出:2 (未受影响) console.log(clonedObject.hobbies.length); // 输出:3 (单独修改后的结果) ``` 以上例子展示了原对象与克隆对象之间的独立性,验证了深拷贝的有效性[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值