数据类型分类
js中两大数据类型:简单数据类型和对象类型。
- 简单类型值::数值、字符串、布尔值、null、undefined
- 引用类型值:函数、数组
- 简单类型值保存的是实际数据,;对象类型值保存的是对于对象的引用。
克隆
- 浅度克隆:简单类型为值传递,对象类型是引用的传递。
- 深度克隆:所有元素或属性完全复制,与元对象完全脱离,也就是说所有对于新对象的修改都不会反映到原对象中。
浅度克隆
- 简单类型值
//数值克隆的表现
var a="1";
var b=a;
b="2";
console.log(a);// "1"
console.log(b);// "2"
//字符串克隆的表现
var c="1";
var d=c;
d="2";
console.log(c);// "1"
console.log(d);// "2"
- 对象类型
前面说过,函数式一等对象,当然也是对象类型,但是函数的克隆通过浅克隆即可实现
var m=function(){alert(1);};
var n=m;
n=function(){alert(2);};
console.log(m());//1
console.log(n());//2
通过普通赋值的方式,就实现了函数的克隆,并且不会影响之前的对象。原因就是函数的克隆会在内存单独开辟一块空间,互不影响。
- 好了,说了这个特殊的”关系户“以后,我们来说说普通的”选手“。为了方便后续的代码表现,我这里定义一个复杂的对象类型oPerson。下面看一下对象类型的浅复制有什么危害:
var oPerson={
oName:"rookiebob",
oAge:"18",
oAddress:{
province:"beijing"
},
ofavorite:[
"swimming",
{reading:"history book"}
],
skill:function(){
console.log("bob is coding");
}
};
function clone(obj){
var result={};
for(key in obj){
result[key]=obj[key];
}
return result;
}
var oNew=clone(oPerson);
console.log(oPerson.oAddress.province);//beijing
oNew.oAddress.province="shanghai";
console.log(oPerson.oAddress.province);//shanghai
经过对象克隆以后,我修改oNew的地址,发现原对象oPerson也被修改了。这说明对象的浅度克隆克隆的是引用,即两个对象指向同一块内存地址。
深度克隆
function clone(obj){
var buf;
if(obj instanceof Array){
buf=[];
var i=obj.length;
while(i--){
buf[i]=clone(obj[j]);
}
return buf;
}else if(obj instanceof Object){
buf={};
for(var key in obj){
buf[k]=clone(obj[k]);
}
return buf;
}else{
return obj;
}