手写一个深拷贝
深拷贝
说到深拷贝,肯定想到的最简单的方式就 JSON.stringify 和 JSON.parse 配合,这个是最简单的深拷贝方式
手写一个深拷贝
深拷贝 = 浅拷贝 + 递归 ,这个只是最笨的一种方式
var a = {
name: "muyiy",
book: {
title: "You Don't Know JS",
price: "45"
},
a1: undefined,
a2: null,
a3: 123
}
// hasOwnProperty表示是否有自己的属性。这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。
function cloneDeep1(source) {
var target = {};
for (var key in source) {
if (source.hasOwnProperty(key)) {
if (typeof source[key] === 'object') {
target[key] = cloneDeep1(source[key]); // 注意这里
} else {
target[key] = source[key];
}
}
}
return target;
}
// 使用上面测试用例测试一下
console.log(a)
var b = cloneDeep1(a);
a.name = "前端进阶";
a.book.price = "55";
console.log(b);
考虑再全一些的深拷贝
function deepClone(obj,hash = new WeakMap()){ //递归实现
if(obj instanceof RegExp) return new RegExp(obj);
if(obj instanceof Date) return new Date(obj);
if(obj === null || typeof obj != "object"){
// 普通数据类型
return obj;
}
if(hash.has(obj)){
return hash.get(obj);
}
// 下面是数组和对象的判断
let t = new obj.constructor();
hash.set(obj,t);
for(let key in obj){
// 递归
if(obj.hasOwnProperty(key)){ //是否是自身的属性
t[key] = deepClone(obj[key],hash)
}
}
return t;
}
当然 递归很容易爆栈,只是别的方法我还尚未全完能够理解出来
errors (99), warring (99)