辉太郎看前端(手写深拷贝递归)

深拷贝

创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“复制”而不是“引用”

注:该代码只能够传对象和数组,其他类不行。

一丶
const add={   //定义的一个对象
     name:"小灰灰",
     age:9,
     sex:{sex:"男"},
     arr:["a","b","c"]
}
//递归函数
  function deepClone(obj){
        //obj 是 null ,或者不是对象和数组,直接返回
      if(typeof obj!== "object"||obj==null){
                return obj;
       }
       let result  //初始化变量
       
       //判断是不是一个数组
       if(obj instanceof Array){
           result=[]
        }else{
           result={}
        }
        
        //循环obj
        for(let key in obj){
           //判断 key 不是一个原型属性
           if(obj.hasOwnProperty(key)){
           //调用递归函数
              result[key]=deepClone(obj[key])
            }
         }
         //返回数据
        return result
}
  //将add拷贝到obj1中
 const obj1=deepClone(add)
 
  console.log(obj1.arr)   //打印结果  ["a","b","c"]
  //给数据arr的第一个值重新赋值
  obj1.arr[0]="d"
  console.log(obj1.arr) //打印结果  ["d","b","c"]
  console.log(add.arr) //打印结果  ["a","b","c"]
二丶
 Object.prototype.clone = function () {
     //判断内置属性arguments是不是一个数组,不是数组就是对象
     var a = this.constructor === Array ? [] : {}
      //构造函数中this指向调用它的对象
      for (var e in this) {
      //  判断this中的每一项是否等于对象,是克隆,不是返回
      a[e] = typeof this[e] === 'object' ? this[e].clone() : this[e]
       
       }
       return a
     }
  let arr = [1, [{ name: "小灰灰", age: "12" }, { sex: "男" }]]
  //arr1克隆arr
  let arr1 = arr.clone()
  arr[1][1].name="辉太郎"
  console.log(arr, arr1)
打印结果

在这里插入图片描述

总结

希望各位,路过的朋友,多多指教。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值