一、写在前面
在任何编程语言中,都存在深拷贝和浅拷贝的概念,js当然也不例外。在对一个现有对象进行拷贝的时候是有深拷贝和浅拷贝之说的,他们在实际使用中区别还是挺大的,如果不弄清原因,可能在工作中遇到错误不好排查。
二、什么是深拷贝和浅拷贝
首先需要明白的一点是:深拷贝和浅拷贝针对的是对象进行操作的。那么就先来看看深拷贝和浅拷贝的具体概念。
在js中,除了基本数据类型以外,还存在引用数据类型。而在一般使用赋值语句=
的时候。对于基本数据类型,实际上只是拷贝它的值,但是对于对象而言,其实赋值的是这个对象的内存引用(内存地址),将原来对象的引用传递过去,实际上新对象和旧对象使用的是同一个内存引用(地址)。
而深拷贝和浅拷贝就是在这个基础上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是做了引用的传递,而没有重新开辟一个内存空间存放这个对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象(开辟新的内存空间),并且复制其内的变量,则认为是深拷贝。
所以到现在,就应该了解,所谓的深拷贝和浅拷贝,只是在拷贝对象的时候,在其中引用类型变量的不同操作(是否为其开辟新的内存空间)而已。
三、js如何实现深拷贝和浅拷贝
由于浅拷贝比较容易实现,所以从易到难开始介绍:
1. 浅拷贝
现在的需求是把变量obj
拷贝给’o’
let obj = {
name: 'lwf',
age: 18,
color: ['红色', '蓝色'],
like: {
game: '玩游戏',
sport: '打乒乓'
}
}
let o = {
}
//浅拷贝
copy = (newObj, oldObj) => {
for (let k in oldObj) {
newObj[k] = oldObj[k]
}
}
copy(o, obj)
o.name = 'cll'
o.color.push('绿色')
console.