深拷贝与浅拷贝的简单理解

首先说下什么是简单数据类型  什么是复杂数据类型

 简单数据类型有 number(数字型) , null, undfande, booler(布尔值),  string(字符串) 

复杂数据类型有array(数组)  object(对象) function(函数) 等等

浅拷贝:

1.如果拷贝的是简单数据类型那么就直接拷贝 对原来的数据不会有影响,

2.如果拷贝的是复杂数据类型 那么拷贝的就是地址 和原来的公用一个数据  只要修改原数据就会受影响

浅拷贝的方式有 :

1.{...obj} 解构的方式

2.Object.assign(obj)

深拷贝:

就是把复杂数据类型也完全复制一份新的出来(指向新的地址),两份数据互不影响

1.先将需要拷贝的代码利用 JSON.stringify 转成字符转,然后再利用JSON.parse 将字符转转回对象,即完成拷贝.但是这种方法有缺点:

  • 造成数据丢失和数据异常
  • function、undefined 直接丢失
  • NaN、Infinity 和-Infinity 变成 null
  • RegExpError对象只得到空对象;

2.就是利用递归 ,

处理函数 Symbol 正则 Error 等数据类型正常拷贝

// 日期格式
if (obj instanceof Date) {
  return new Date(obj)
}
// Symbol
if (obj instanceof Symbol) {
  return new Symbol(obj)
}
// 函数
if (obj instanceof Function) {
  return new Function(obj)
}
// 正则
if (obj instanceof RegExp) {
  return new RegExp(obj)
}

自己写的递归容易造成死循环 解决思路就是 吧每次拷贝的数据进行存储,然后拷贝之前看看存储的数据中是否有要拷贝的数据 如果有就直接返回出来用 如果没有就进行拷贝

3.lodash里面有写好的方法 也可以拿来直接用


版权声明:本文为ljb376766764原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。