定义
- 1 要弄明白这俩的区别首先的明白数据分为基本数据类型
(Number,String,Boolean,Undefined,Null,Symbol)和
对象数据类型(所有引用数据皆为对
象,Array,Object,Function,Date,RegExp)。 - 2 基本数据类型的特点:直接存在栈中。
- 3 引用数据类型的特点:存储的是该对象在栈中的引用,真实数据保存在堆里。
- 4 数组,对象,函数这些,存的都是一个内存地址,数组,对象,函数,日期这些引用类型在栈中储存的是指 针。实际指向一个内存地址,浅拷贝其实就是拷贝的内存地址,浅拷贝只会改变第一层的内存地址,后面的不变, 深拷贝就是每层地址都会改变。
浅拷贝和赋值的区别
- 当我们把对象赋值给另一个变量时,这时其实是赋的是该对象在栈中的地址,也就是两个对象指向同一个内存 地址,改一个另一个也会修改。
- 浅拷贝只会改变第一层的数据,后面的内存地址新旧对象都是一致的,改一个会影响另一个。
赋值:
浅拷贝:
`//浅拷贝
function shallowClone(param){
let result = Array.isArray(param) ? [] : {};
for(const key in param) {
result[key] = param[key];
}
return result;
}
//深拷贝
function deepClone(param, map = new Map()) {
if(typeof param === 'object'){
if(map.get(param)){
return map.get(param);
}
let result = Array.isArray(param) ? [] : {};
map.set(param, result);
for(const key in param){
result[key] = deepClone(param[key], map);
}
}
else{
return param
}
}`