- 递归
- 判断类型 不同的类型有不同的方法
- 检查环(也叫循环引用)一个对象引用了自己,递归的时候容易出不来
- 需要忽略原型,不拷贝原型,拷贝原型,特别浪费内存
function clone(target, map = new Map()) {
if (target !== null && typeof target === 'object') { // 先判断类型,是简单类型还是引用类型
let cloneTarget = Array.isArray(target) ? [] : {};//判断是对象还是数组
if (map.get(target)) {//检查环(循环引用)
return target;
}
map.set(target, true);
for (let key in target) {
if (target.hasOwnProperty(key)) {// 判断是否是对象上的属性,而不是原型上的属性
cloneTarget[key] = clone(target[key], map);//递归克隆
}
}
return cloneTarget;
} else {
return target;
}
};
function cloneFunction(fn) {
const bodyReg = /(?<={)(.|\n)+(?=})/m;//匹配函数体
const paramReg = /(?<=\().+(?=\)\s+{)/;//匹配参数
const fnString = fn.toString();//把函数转成字符串
if (fn.prototype) {
const param = paramReg.exec(fnString);
const body = bodyReg.exec(fnString);
if (body) {
if (param) {
const paramArr = param[0].split(',');
return new Function(...paramArr, body[0]);
} else {
return new Function(body[0]);
}
} else {
return null;
}
} else {
return Function('"use strict";return fnString')();
}
}
网友评论