1、JS对象类型
js对象分为:基本类型和引用类型,基本类型存放在栈内存,引用类型存放在堆内存。
2、栈内存和堆内存
(1)栈内存:保存基本类型数据
1、占用空间固定
2、保存于复制是值本身
3、使用typeof检测数据的类型,但无法检测null类型
(2)堆内存:保存引用类型数据
1、占用空间不固定
2、保存与复制的是指向对象的一个指针
3、使用instanceof检测数据类型,返回false或true,但是无法正确区分[]
3、深拷贝和浅拷贝的区别
最根本区别在于是否是真正获取了一个对象的复制实体,而不是引用
注:浅拷贝仅指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变
4、深拷贝的方法
(1)JSON.stringfy()、JSON.parse():缺点:当值为undefined、function、symbol会在转换过程中被忽略
(2)Object.assign():缺点:只适用于简单的数据类型,比如只有一级属性
(3)递归方法实现:参考链接
function deepClone(obj) {
// 判断要进行深拷贝的是数组还是对象,如果是数组就进行数组拷贝,是对象就进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
// 进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}