深克隆需要考虑的问题
- 需要支持7种基本数据类型:number\string\boolean\symbol\null\undefined\Object
- JSON 克隆不支持函数、引用、undefined、Date、RegExp 等
- 递归克隆要考虑环、爆栈
- 要考虑 Date、RegExp、Function 等特殊对象的克隆方式
- 要不要克隆 proto,如果要克隆,就非常浪费内存;如果不克隆,就不是深克隆
JSON实现克隆方式
var obj = {a:1}
var objString = JSON.stringify(obj);
var object = JSON.parse(objString);
比较满意的克隆
class DeepClone {
constructor(){
this.cache = [];
}
clone(source){
if(source instanceof Object){
let cachedDist = this.findCache(source);
if(cachedDist){
return cachedDist;
}else{
let dist;
if(source instanceof Array){
dist = new Array();
}else if(source instanceof Function){
dist = function(){
return source.apply(this,arguments);
}
}else if(source instanceof RegExp){
dist = new RegExp(source.source,source.flags);
}else if(source instanceof Date){
dist = new Date(source);
}else{
dist = {};
}
this.cache.push([source,dist]);
for(let key in source){
if(source.hasOwnProperty(key)){
dist[key] = clone(source[key]);
}
}
return dist;
}
}
return source;
}
findCache(source){
for(let i = 0; i < this.cache.length; i++){
if(this.cache[i][0] === source){
return this.cache[i][1];
}
}
return undefined;
}
}
module.exports = DeepClone;