首先说下什么是简单数据类型 什么是复杂数据类型
简单数据类型有 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
-
RegExp
、Error
对象只得到空对象;
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里面有写好的方法 也可以拿来直接用