js中的深拷贝方法-笔记

三种办法可以实现深拷贝-笔记

参考来自: 听风是风-深拷贝与浅拷贝的区别,实现深拷贝的几种方法
↑↑↑↑原文讲得非常清晰透彻!推荐大家阅读! ↑↑↑↑

分别是使用递归实现、使用JS中JSON实现、使用jQuery库的extend方法实现。

1.递归实现

思路:利用递归层层遍历复制所有层级的属性
封装深拷贝函数,遍历每个属性,若是复杂数据类型则递归调用深拷贝函数,若是简单的数据类型直接复制

function deepCopy1(obj){
  let newObj=Array.isArray(obj)?[]:{}
  for(let k in obj){
    let item=obj[k]
    if(typeof(item)==='object'){
      newObj[k]=deepCopy1(item)
    }
    else{
      newObj[k]=item
    }
  }
  return newObj
}

测试用例

var data1={
  name:'lucy',
  msg:{
    age:18,
    sex:'female',
    hobbies:['swimming','dancing','sleeping']
  },
  school:'ahu'
}
var data2=deepCopy1(data1)
//修改data1的某个数据,打印data1和data2,显示data2对应的数据不会受影响
data1.msg.age=16
console.log('data1',data1)
console.log('data2',data2)

输出结果
方法1-结果示例

2.利用JSON.parse和JSON.stringify

先把要拷贝的对象用JSON.stringify转为字符串,再用JSON.parse把字符串转为对象。

function deepCopy2(obj){
  let obj2=JSON.stringify(obj)
  return JSON.parse(obj2)
}

测试用例

var data3=deepCopy2(data2)
//修改data2的某个数据,打印data2和data3,显示data3对应的数据不会受影响
data2.msg.age=14
console.log('data2',data2)
console.log('data3',data3)

输出结果
方法二结果示例

3.利用jQuery库的extend方法

该方法要引入jQuery库,请在HTML页面中使用

语法:$.extend([deep],target,object1[,objectN])

[deep] : 是否为深拷贝 true为深拷贝,false为浅拷贝 ,默认值为false
target: Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
object1: 可选。 Object类型 第一个被合并的对象
objectN: 可选。 Object类型 第N个被合并的对象。

//深拷贝1个数据
var data4=$.extend(true,[],data3)
//深拷贝多个数据
var data5=$.extend(true,{},[data1,data2,data3])

测试用例

console.log('data4',data4)
console.log('data5',data5)

输出结果
在这里插入图片描述

小结

  • 深拷贝:利用递归层层遍历复制所有层级的属性。新拷贝的数据更改不会影响旧数据。
  • 浅拷贝:对于复杂数据类型,相当于新数据的引用地址与旧数据的引用地址一致,两者指向同一份数据,数据的修改会影响彼此。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值