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);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值