es5深度拷贝
var obj = {
name: 'xr',
age: 18,
info: {
hobby: ['travel', 'footerball'],
carrer: {
engineer: 5
}
}
}
function deepCloneByES5(origin, target) {
var tar = target || {},
toStr = Object.prototype.toString,
arrType = '[object Array]';
for (k in origin) {
if(origin.hasOwnProperty(k)) {
let item = origin[k];
if(typeof item === 'object' && item !== null) {
tar[k] = toStr.call(item) === arrType ? [] : {};
deepCloneByES5(item, tar[k]);
} else {
tar[k] = item;
}
}
}
return tar;
}
es6深度拷贝
WeakMap基本使用
const oBtn1 = document.querySelector('#btn1');
const oBtn2 = document.querySelector('#btn2');
const oBtnMap = new WeakMap();
oBtnMap.set(oBtn1, handleBtn1Click);
oBtnMap.set(oBtn2, handleBtn2Click);
oBtn1.addEventListener('click', oBtnMap.get(oBtn1), false);
oBtn2.addEventListener('click', oBtnMap.get(oBtn2), false);
function handleBtn1Click() {}
function handleBtn2Click() {}
oBtn1.remove();
oBtn2.remove();
深度拷贝
function deepCloneByWeakMap(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] = deepCloneByWeakMap(origin[key], hashMap);
}
}
return target;
}
let test1 = {};
let test2 = {};
test2.test1 = test1;
test1.test2 = test2;
console.log(deepCloneByWeakMap(test2));