📐拷贝[copy]
简言之,把它复制过来。为啥分为“浅”和“深”呢?
这就得从数据类型说起了,简单数据类型很简单存储在小栈中,而引用数据类型就不一样了,存储在堆中不要紧,在我们需要调用数据时只能取到它的引用地址,利用地址处理数据。
✍🏻浅拷贝
只拷贝最外面一层,更深层次级别的对象只拷取引用。
es5:中拷贝采取`for in`循环
es6:Object.assign(targetObj,sourceObj)
var a = 1;
b = a; // 栈内存会开辟一个新的内存空间,此时b和a都是相互独立的
b = 2;
console.log(a); // 1
✍🏻深拷贝
完全拷贝,包括引用对象。
终极解决方案:递归
const obj = {
name: '雷军',
works: '小米10',
sister: {
name: '雷布斯',
age: 90
},
function() {
console.log('小米为发烧而生')
}
}
function deepClone(obj) {
var cloneObj = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === 'object') {
for (key in obj) {
if (obj[key] && typeof obj[key] === 'object') {
cloneObj[key] = deepClone(obj[key])
} else {
cloneObj[key] = obj[key]
}
}
}
return cloneObj
}
const newObj = deepClone(obj)
newObj.sister.name = '王炸'
console.log(newObj.sister.name) // 王炸
-------------------------------------------------------------------------
通过JSON对象来实现深拷贝
const obj1=JSON.parse(JSON.stringfy(obj))
console.log(obj1) // 丢失sister对象以及function函数
缺点:对象中的深拷贝为undefined
👍总结
如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生
变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。