深拷贝、浅拷贝的区别及方法
2020-05-26 本文已影响0人
柚子硕
深拷贝浅拷贝的区别在于深拷贝是在内存中重新创建一块区域,和拷贝对象再无联系。浅拷贝中两个对象的参数仍会指向同一块区域,所以修改任一对象内的值,另一个对象的值也会改变。
深拷贝的方法
1.递归拷贝
// 深拷贝
function deepCopy(o1, o2) {
for (var key in o1) {
if (o1[key] instanceof Array) {
console.log(key);
// 如果key是数组类型 Array?
o2[key] = [];
deepCopy(o1[key], o2[key]);
} else if (o1[key] instanceof Object) {
// 如果key是复杂类型 Object?
o2[key] = {};
deepCopy(o1[key], o2[key]);
} else {
// 如果key这个属性 是基本类型
o2[key] = o1[key];
}
}
}
2.JSON.stringify()
如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象;
如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象;
如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失;
如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;
3.Object.defineProperty
Object.defineProperty(Object, "deepClone", {
configurable: true,
enumerable: true,
writable: false,
value: function(dest, source) {
if (dest === undefined || source === undefined) {
throw Error("dest can not be undefined");
}
if (!(source instanceof Object)) {
throw Error(source, "is not a object");
}
Object.getOwnPropertyNames(source).forEach(function(prop) {
if (typeof source[prop] === Object) {
Object.deepClone(dest[prop], source[prop]);
} else {
dest[prop] = source[prop];
}
});
}
});
浅拷贝的方法
1.Object.assign()
image.png
2.解构赋值
image.png