深拷贝与浅拷贝的区别在哪里呢?
要想搞清楚这个问题,必须要清楚数据类型,js中分为2种数据类型,
基本数据类型(number,string,boolean,null,undefined)
基本数据类型是保存在栈区的,是一个大小固定的内存区域
引用类型(function,object,array,date)
引用类型是保存在堆区的,是大小不固定的内存区域,然后在栈区中保存对应对象在堆区的地址,用白话说就是,引用类型在栈区保存的是堆区的地址指针,其真正的内容数据是保存在堆区的
那么,到这里就可以谈谈深拷贝与浅拷贝的区别了,
浅拷贝:比如是一个引用类型,就是拷贝其在栈区的地址指针
比如:
let obj = {a:1,b:2};
let copyObj = obj;
复制代码
obj与copyObj都是指向同一堆区的地址,就是说如果改变obj,copyObj也跟着发生改变
深拷贝: 就是讲起堆区的数据一并复制,得到两个完全独立的变量,改变其中一个不会影响另外一个。
function deepClose(obj) {
let newObj = obj instanceof Array ? [] : {};
if (typeof obj !== "object") {
return obj;
}else {
// obj 是数组或者是对象,遍历复制
for (let i in obj) {
newObj[i] = typeof obj[i] ==="object" ? deepClose(obj[i]) : obj[i];
}
}
return newObj;
}
复制代码