一、s中的数据类型
-
Js中数据类型分为两大类:(1)基本数据类型:数值、字符串、布尔值、null、undefined(2)复杂数据类型:对象
二、克隆的概念:
浅度克隆:基本数据类型为值传递,对象类型为引用传递
深度克隆:所有属性和方法均完全复制,与原对象完全脱离,也就是说对于新对象的任何修改都不会反映到元对象中。
三.浅克隆的表现:
1.基本数据类型:
var a="a";
var b=a;
b="b";
console.log(a); //a
console.log(b);//b
2.复杂数据类型:
(1)函数的克隆
函数也是对象,但是函数的克隆通过浅克隆就可以实现
var a=function(){alert(1);};
var b=a;
b=function(){alert(2);};
console.log(a); //function(){alert(1);}
console.log(b); //function(){alert(2);}
通过普通的负值方式,就是想了函数的克隆,并且不会影响之前的对象。原因就是函数的克隆会在内存中单独开辟一块空间,互不影响。
(2)普通的对象
var oPerson={
oName:"石倩蓉",
oAge:"18",
oAddress:{
province:"beijing"
},
ofavorite:[
"swimming",
{reading:"history"}
]
}
function clone(obj){
var result={};
for(var key in obj){
result[key]=obj[key];
}
return result;
}
var student=clone(oPerson);
console.log(oPerson.oAddress.province); //”beijing”
student.oAddress.province="shanghai";
console.log(oPerson.oAddress.province); //”shanghai”
四.深度克隆实现
为了保证对象的所有属性都被复制到,我们必须知道如果for循环以后,得到的元素仍是Object或者Array,那么需要再次循环,直到元素是原始类型或者函数为止。为了得到元素的类型
/*----------------------------数据类型的判断--------------------------------*/
function isClass(obj){
if(obj===null) return "null";
if(obj===undefined) return "undefined";
return Object.prototype.toString.call(obj).slice(8,-1);
}
/*------------------------------------------------------------*/
function deepClone(o){
var result;
var oClass=isClass(o);
if(oClass=="Object"){
result={};
}else if(oClass=="Array"){
result=[];
}else{
return o;
}
for(var key in o){
result[key]=arguments.callee(copy); //递归调用
}
return result;
}
/*------------------------------------------------------------*/
var oPerson={
oName:"shiqianrong",
oAge:"24",
oAddress:{
province:"shanxi"
},
oFavoriate:[
"swimming",
{reading:"history book"}
]
}
/*------------------------------------------------------------*/
var student=deepClone(oPerson);
console.log(oPerson.oAddress.province);
student.oAddress.province="shanghai";
console.log(oPerson.oAddress.province);