深度拷贝(递归拷贝)
2019-06-14 本文已影响0人
CRUD_科科
深度拷贝
拷贝出来的和被拷贝的没有关系,即被拷贝的属性改变,拷贝出来的属性不会跟着改变。
// 深度拷贝 递归拷贝 (拷贝出来的和被拷贝的没有关系)
function deepClone(value) {
// null undefined直接返回 null == undefined是true,但是null == undefined是false
if (value == null) return value; // 因为上面,所以这里只判断null
if (typeof value !== 'object') return value; // 不是对象的有:Number、Boollean、Function
if (value instanceof Date) return new Date(value); // 如果是日期返回重新创建的日期
if (value instanceof RegExp) return new RegExp(value);
// 如果是对象或者数组
let construc = new value.constructor(value);
for (const key in value) {
if (value.hasOwnProperty(key)) {
construc[key] = deepClone(value[key]); // 如果是obj,那么继续调用自己循环,这就叫做递归拷贝
}
}
return construc;
}
// console.log(new {}.constructor) // {}.constructor = Object() new Object() = {}
console.log(deepClone([1,2,{a:{b:1,c:{d:function(){}}}}]))