您的位置:首页 > Web前端 > JavaScript

JavaScript 深度克隆

2015-09-22 22:37 686 查看
需求:

*使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝

*被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。不会包含函数、正则对象等

什么是深度克隆,通俗的说:就是在给你一个对象的前提下,你创建一个和这个对象一模一样的对象,所有属性和值都相等,并且修改新对象的属性不会影响旧的对象。


自己归纳了两种实现方法,惭愧的是自己不能通过自己的努力来解决这个问题,现记录如下:

第一种方法显得挺简单直接,有一定的基础js能力便能理解,代码如下:

function clone(obj){
var o;
switch(typeof obj){
case 'undefined': break;
case 'string'   : o = obj + '';break;
case 'number'   : o = obj - 0;break;
case 'boolean'  : o = obj;break;
case 'object'   :
if(obj === null){
o = null;
}else{
if(obj instanceof Array){
o = [];
for(var i = 0, len = obj.length; i < len; i++){
o.push(clone(obj[i]));
}
}else{
o = {};
for(var k in obj){
o[k] = clone(obj[k]);
}
}
}
break;
default:
o = obj;break;
}
return o;
}


以构造方法实现是为方法二:

function clone2(obj){
var o, obj;
if (obj.constructor == Object){
o = new obj.constructor();
}else{
o = new obj.constructor(obj.valueOf());
}
for(var key in obj){
if ( o[key] != obj[key] ){
if ( typeof(obj[key]) == 'object' ){
o[key] = clone2(obj[key]);
}else{
o[key] = obj[key];
}
}
}
o.toString = obj.toString;
o.valueOf = obj.valueOf;
return o;
}


真正需求所说的实现方法如下,用递归来完成:

function clone3(obj){
function Clone(){}
Clone.prototype = obj;
var o = new Clone();
for(var a in o){
if(typeof o[a] == "object") {
o[a] = clone3(o[a]);
}
}
return o;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript