深拷贝浅拷贝
程序员文章站
2022-05-29 10:49:24
...
理解的深拷贝浅拷贝,不得不说,每次面试基本都会问到这个问题,可是貌似我每次答的都不在那个点上,所以我又研究了一番!!若有不对,望指出!!
首先,需要明确一点,深拷贝和浅拷贝都是对于引用数据类型来说的。
对于基本数据类型,直接就放在栈内存中存储即可,而对于引用数据类型来说,其实只是把这个引用数据类型的名字存在栈内存中,而真正里面的数据存储在堆内存中。
对于基本数据来说,当我们给他赋值的时候,就会给他开辟一个栈内存。
也就是说对于基本数据类型我们就是按值访问,对与引用数据类型来说是按地址来访问。深拷贝和浅拷贝说白了,其实都是为了当改变原先数据的值,可以保证拷贝之后的数据不会受到影响。
下面我们来看浅拷贝
方法一:Object.assign
let obj = {
name: 'shizi',
age: 22
}
let b = Object.assign({}, obj)
obj.age = 33
console.log(b);
可以看到当我们改变obj的值的时候,通过浅拷贝方式得到的b的值并没有受到影响。
方法二:es6中新增的展开运算符
let obj = {
name: 'shizi',
age: 22
}
// let b = Object.assign({}, obj)
let b = {
...obj
}
obj.age = 33
console.log(b);
下面我们来看这种情况
let obj = {
name: 'shizi',
age: 22,
a: {
name: 'lss',
age: 33
}
}
let b = Object.assign({}, obj)
// let b = {
// ...obj
// }
obj.a.age = 22
console.log(b);
很明显,这个值改变它做到了 ,它成功的把咱们浅拷贝过来的值也给改变了,哈哈哈!!脑壳痛。。。
那言归正传,针对这种情况,浅拷贝已经没有作用了,那么深拷贝该上场了,从字面意义一看,就能看出来深拷贝比浅拷贝更加厉害了。
JSON.parse(JSON.stringify(object))
let obj = {
name: 'shizi',
age: 22,
a: {
name: 'lss',
age: 33
}
}
let b = JSON.parse(JSON.stringify(obj))
// let b = Object.assign({}, obj)
// let b = {
// ...obj
// }
obj.a.age = 22
console.log(b);
小结
总的来说,也就是浅拷贝只可以保护第一层可以不被原本值的改变所影响,第二层就保护不到了,而深拷贝则也可以保护第二层里面的值也不被原本值的改变所影响,为此我又想那第三层第四层呢,通过我滴测试,都不会被影响到。
上一篇: 学习PHP编程语言的一些总结
下一篇: 一个比较蛋疼的php缓存类