深拷贝与浅拷贝的示意图:
浅拷贝是把对象拷贝给一个新的对象,只复制指向某个对象的指针,不复制对象本身。如果拷贝对象是基本数据类型,则拷贝的是值;如果拷贝对象是引用类型的,则复制的是地址,修改任何一个对象,另一个对象都会发生变化。
深拷贝是拷贝多层,创建一个一模一样的对象,但不共用内存,不拷贝地址,且新旧对象的修改,不会影响到对方。
浅拷贝对象的方法:
1、Object.assign()
let obj0 = {
obj1: {
name: 'Tom',
age: 18
}
}
let obj3 = Object.assign({}, obj0)
console.log(obj0,obj3)
obj3.obj1.age = 20
console.log(obj0,obj3)
注意:当object只有一层的时候,是深拷贝
let obj = {
name: 'Tom',
age: 18
}
let obj2 = Object.assign({}, obj)
console.log(obj,obj2)
obj.age = 20
console.log(obj,obj2)
2、concat
let obj = [1,2,3,{name: 'Tom'}]
let obj2 = obj.concat()
console.log(obj,obj2)
obj2[2].name = 'john'
console.log(obj,obj2)
深拷贝的方法:
1、JSON序列化方式
const newObj = JSON.parse(JSON.stringfy(oldObj))
function 和 undefined 等,在序列化过程中会被忽略。
let obj = [1,2,3,{name: 'Tom'}]
let obj2 = JSON.parse(JSON.stringify(obj))
console.log(obj,obj2)
obj2[3].name = 'john'
console.log(obj,obj2)
2、loadash库
let _ = require('lodash')
let obj = [1,2,3,{name: 'Tom'}]
let obj2 = _.cloneDeep(obj)
console.log(obj,obj2)
obj2[3].name = 'john'
console.log(obj,obj2)
3、递归
函数内部自己调用自己,就是递归,这个函数就是递归函数。由于地柜很容易发生“栈溢出”的错误,所以一定要添加退出条件return。
递归思路:
a、封装函数,先判断拷贝的是数组还是对象
b、开始遍历
c、如果属性值是引用数据类型,则再次递归
d、如果属性值是基本数据类型,则直接赋值即可
function cloneDeep(obj) {
let newObj = Array.isArray(obj) ? [] : {}
for (let key in obj) {
if (typeof obj[key] === 'object') {
newObj[key] = cloneDeep(obj[key])
} else {
newObj[key] = obj[key]
}
}
return newObj
}
const o = cloneDeep(obj)
本文含有隐藏内容,请 开通VIP 后查看