浅拷贝与深拷贝
浅拷贝:
浅拷贝,其实就是创建一个新的对象,它就是对原始数据的复制,如果是基本数据类型的话,就是复制它的值。
而如果是复杂数据类型的话,拷贝的就是它的地址,
即新的对象与原始的对象共用同一块地址,改变两者任意一方的值,都会影响到另外一方的值。
即简单地只拷贝一层。下面写个代码:
function shallowClone(obj){
const newObj = {};
for( let key in obj){
if(obj.hasOwnProperty[key])
newObj[key] = obj[key];
}
return newObj
}
在JavaScript中,能实现浅拷贝的方法:
Object.assign()
Array.prototype.slice()
深拷贝:
深拷贝则是开辟一个新的内存空间,即开辟一个新的栈。
它们的属性完全相同,但是它们对应不同的地址,即改变其中一个的属性,不会影响另一个对象的属性。
在JavaScript中,实现深拷贝的方法:
_.cloneDeep()
JSON.stringify()
手写循环递归实现
下面手写实现一下循环递归:
function deepClone(obj, hash = new WeakMap()) {
if (obj === null) return obj;
if (obj instanceof RegExp) return new RegExp(obj);
if (obj instanceof Date) return new Date(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;
}
区别
浅拷贝和深拷贝它们都是创建出一个新的对象,但是它们的复制行为不一样。
浅拷贝只复制属性指向对象的指针,而不复制对象本身。
新旧对象还是共用同一块内存地址,修改时会互相影响
而深拷贝则创建出一个一模一样的对象,但是不共用内存,修改时不会相互影响。