es5 深拷贝对象封装
方案一
function deepClone(origin, target) {var tar = target || {}; //如果没有传参则设置默认值var toStr = Object.prototype.toString(); //判断类型var arrType = '[object Array]';for (k in origin) {if (origin.hasOwnProperty(k)) { //是否是自身的属性if (typeof origin[k] === 'object' && origin[k] === null) { //排除null 因为typeof null 是 objecttar[k] = toStr.call(origin[k]) === arrType ? [] : {}; //如果是引入类型则存储起来然后再执行函数判断deepClone(tar[k]);} else {tar[k] = origin[k];}}}return tar;}
知识点归纳
1.判断数据类型Object.prototype.toString.call() 结果为 [object Array] 或 [object object]
2.hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
方案二
function deepClone(origin, hashMap = new WeakMap()) {
if (origin == undefined || typeof origin !== 'object') {
return origin;
}
if (origin instanceof Date) {
return new Date(origin);
}
if (origin instanceof RegExp) {
return new RegExp(origin);
}
const hashKey = hashMap.get(origin);
if (hashKey) {
return hashKey;
}
const target = new origin.constructor();
hashMap.set(origin, target);
for (let k in origin) {
if (origin.hasOwnProperty(k)) {
target[k] = deepClone(origin[k], hashMap);
}
}
return target;
}
let test1 = {};
let test2 = {};
test2.test1 = test1;
test1.test2 = test2;
console.log(deepClone(test2));
WeakMap 知识点
7、Set集合与Map集合
面试题 let test1 = {}; let test2 = {};test2.test1 = test1;test1.test2 = test2;
function deepClone(origin, hashMap = new WeakMap()) {
if (origin == undefined || typeof origin !== 'object') {
return origin;
}
if (origin instanceof Date) {
return new Date(origin);
}
if (origin instanceof RegExp) {
return new RegExp(origin);
}
const hashKey = hashMap.get(origin);
if (hashKey) {
return hashKey;
}
const target = new origin.constructor();
hashMap.set(origin, target);
for (let k in origin) {
if (origin.hasOwnProperty(k)) {
target[k] = deepClone(origin[k], hashMap);
}
}
return target;
}
let test1 = {};
let test2 = {};
test2.test1 = test1;
test1.test2 = test2;
console.log(deepClone(test2));
