浅拷贝与深拷贝
关于深浅拷贝,相信大家也都挺熟悉的了
用生活的举例子来说明就是
-
浅拷贝就是“换汤不换药”,就好像加多宝和王老吉,它们的不一样的品牌,但是喝起来的味道是一样的
-
深拷贝就是“双胞胎”,两张长一样,但是都是互相独立的个体
而在javascrpit中也提供的很多API来实现深拷贝,浅拷贝的话就不啰嗦了
接下来就开始进入实现深拷贝的流程
1. JSON.parse(JSON.stringify())
实现深拷贝最简单的实现方式,这种实现的深拷贝可以满足我们开发业务中大多数的场景要求
但是,有个弊端就是因为当前的原理是其转为JSON数据再转回原数据,所以如果当前数据不支持转JSON
的就会失效,比如如果一个key的value是function,那么拷贝过后就是undefined
let obj = {
name: '张三',
fun: function(){}
}
let obj2 = JSON.parse(JSON.stringify(obj))
//fun丢失
console.log(obj) // obj = { name: '张三', fun: f() }
console.log(obj2) // obj = { name: '张三' }
2.手写递归方式
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝
下面我们着手实现一个简单版本的递归深度拷贝
let obj = {
name: '张三',
list: [1,5,6,2,8,8,9]
}
function copyClone(obj){
if(typeof obj === 'object'){
let result = Array.isArray(obj)?[]:{}
for (const key in obj) {
result[key] = copy(obj[key])
}
return result
}else{
return obj
}
}
console.log(copyClone(obj)) //obj = { name: '张三', list: [1,5,6,2,8,8,9]}
深拷贝的婴儿版本就这样诞生了!!