js中的数据类型分为两大类:原始类型和对象类型;
原始类型:数值,字符串,布尔值,null,undefined
对象类型:函数 数组
这两种类型在复制克隆的时候有很大的区别,原始类型存储的是对象的实际数据,而对象类型存储的是对象的引用地址
克隆的概念:
浅度克隆:原始类型为值传递,对象类型仍为引用传递。
深度克隆:所有元素或者属性均为完全复制,与原对象完全脱离,也就是说对于所有新对象的修改均不会反映到原对象中。
深克隆的实现
为了保证对象的所有属性都被复制到,我们必须知道如果 for 循环以后,得到的元素仍是object或者array 那么需要再次循环,直到元素是原始类型或者函数为止,为了得到元素的类型,我们定义一个通用函数,用来返回传入对象的类型。
//返回传递给他的任意对象的类
function isClass(o){
if (o === null)return 'null';
if(o===undefined)return 'undefined';
return Object.prototype.toString.call(o).slice(8,-1);//能直接返回对象的类属性
}
function deepClone(obj){
var result,oClass= isClass(obj);//确定result的类型
if (oClass==='object'){
result = {};
}else if(oClass ==="Array"){
result = [];
}else{
return obj;
}
for(key in obj){
var copy = obj[key];
if(isClass(copy)=="object"){
result[key] = arguments.callee(copy);
}else{
result[key]=obj[key];
}
}
return result;
}