深拷贝和浅拷贝
前言
深拷贝和浅拷贝是面试中常问的问题,这次彻底总结一下
正文
数据类型存储特点:
基本数据类型 | 引用类型 |
---|---|
直接存储在栈stack中 | 在栈中存储指针,在堆中获得实体(真实数据) |
深拷贝和浅拷贝
如何自己实现一个深拷贝?
function deepClone(obj,hash = new WeakMap) {
if(obj == null) return obj //如果是null或者undefined就不进行拷贝操作
if(obj instanceof Date) return new Date(obj)
if(obj instanceof RegExp) return new RegExp(obj);
//剩下考虑的就是 对象或普通值了,之所有不考虑函数,是因为函数是用来调用的,是不需要进行深拷贝的
if(typeof obj !== "object") return obj;
//下面就是需要考虑对象类型了,是对象的话就进行深拷贝
if(hash.get(obj)) return hash.get(obj)
let cloneObj = new obj.constructor;
hash.set(obj,cloneObj);
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
//实现一个递归拷贝
cloneObj[key] = deepClone(obj[key],hash);
}
}
return cloneObj;
}