持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
上文讲到利用数据转换可以实现深拷贝,但是无法识别函数.lodash.js中提供了解决这个问题的方案
_.cloneDeep实现完美深拷贝
<script src="./lodash.min.js"></script>
<script>
const obj = {
name: '幻境',
age: 18,
za: ['me'],
fn: () => {
console.log('哈哈哈')
}
}
const obj2 = _.cloneDeep(obj)
console.log(obj)
console.log(obj2)
obj2.name = '梦魇'
obj2.za.push('zj')
console.log(obj)
console.log(obj2)
</script>
_.cloneDeep后面写定义好的对象,就可以完美的把它拷贝给空对象.那么他是如何实现的呢?在此之前我们先了解一个新概念---递归函数
递归函数
简单来说递归函数就是自己调用自己的函数 注意:递归要有停止条件, 否则就是死递归; 可以用两种方式的停止条件防止递归函数不停的调用自己.
条件1: 调用有条件(满足条件才调用函数)
let count = 0
function fn1() {
//条件1: 调用有条件;
console.log('Gala8')
count++
if (count < 3) {
fn1()
}
}
fn1()
条件2: 跳出有条件(满足条件就停止调用)
let count = 0
function fn2() {
//条件2: 跳出有条件;
if (count >= 3) {
return
}
console.log('Gala8')
count++
fn2()
}
fn2()
递归之深浅拷贝
我们先要了解一个定理:所有复杂数据类型,分析到最后,一定会是两种类型函数和简单数据类型
那么我们利用递归实现深浅拷贝只要明白我们要做的事就是封装一个方法,实现深层复制; 把obj2里面的各种属性值,复制到obj1里面去;
如果只考虑浅拷贝,那么就用for.. . in...遍历obj2,然后让obj1里面也赋值一份
for (let k in obj2) {
obj1[k] = obj2[k]
}
}
let ol = {
name: '张三',
age: 18
}
let o2 = {}
cloneDeep(o2, ol)
console.log(ol)
console.log(o2)
可以实现.