关于深克隆的思考

深克隆需要考虑的问题

  • 需要支持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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobangsky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值