深拷贝 :
首先定义一个对象,如上所示。
<script>
const obj = {
name: '李逍遥',
age: 18,
address: {
name: '余杭镇'
}
}
function deepClone(obj) {
// 先判断obj是否为一个对象
if (typeof obj != 'object') {
return obj
}
// 根据obj的类型判断并定义一个新的变量用于接收数据,生成一个新的对象/数组
// 实现拷贝的功能
let result = Array.isArray(obj) ? [] : {}
// 将对象中的属性值遍历出来
for(let key in obj){
result[key]=obj[key]
}
return result
}
const obj2=deepClone(obj)
</script>
接下来我们来测试
发现确实是实现了拷贝的功能,新生成的对象改变其中的第一层属性,并没有引起obj中的数据的变化,这是符合拷贝的。然而 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
当我仅仅想要改变obj2中address中name的时候发现,原来的obj中的数据也发生了变化,这并不是我们想要的深度拷贝,深度拷贝是即使是数组/对象中的改变也不应该影响原来数据的变化。所以发现上面的代码只能实现第一层的拷贝也就是浅拷贝,如果仅仅只是想实现浅拷贝,那干脆...扩展运算符不就好了吗(下方有浅拷贝的方法)?于是在之前的代码中加上递归的方法,就可以实现深拷贝了
接下来我们进行测试
那上方的for in 是什么?以及为什么使用递归就可以了呢?
for in的作用是遍历对象中的属性当然也可以获取对象属性的属性值,由于key是个变量,所以要使用 [ ] ,如果deepClone的参数还是个对象它就会再来一遍,一层一层直至全部拷贝完成
浅拷贝:
上文提到了扩展运算符,是不是可以实现浅拷贝(第一次数据的拷贝)呢?
测试一下:
发现确实是实现了浅拷贝的功能
const obj = {
name: '李逍遥',
age: 18,
address: {
name: '余杭镇'
}
}
obj2={...obj}
如有问题请指正