复制关系(基本类型:字符串,数字,布尔值,null,undefined)
eg:
var a=5;
var b=a;
b+=3;
alert(a)//5;
引用关系(对象与函数)
eg 1:
var a=[1,2,3];
var b=a;
b.push(4);
alert(a);//[1,2,3,4]
解释:a,b共用同一天地址,然后b在地址上修改了,所以a也改变了。
eg 2:
var a=[1,2,3]
var b=a;
b=[1,2,3,4];
alert(a);//[1,2,3,4]
alert(b);//[1,2,3,4]
解释:a,b共用同一条地址,然后b重新赋值,上面是修改b,这里是又创建了一个b,为一条新的地址,与a无关了。
应用:浅拷贝与深拷贝
浅拷贝:
function copy(){
var newObj = {};
for(var attr in obj){
newObj[attr]=obj[attr];
}
return newObj;
}
情况一:
var obj={a:10};
var obj2=copy(obj)
obj2.a=20;
alert(obj.a);//10
情况二:
var obj={a:{b:10}};
var obj2=copy(obj);
obj2.a.b=20;
alert(obj.a.b);//20
原因:浅拷贝,只拷贝了一层,是{b:10},为对象,所以还是引用关系。
深拷贝:
递归:函数调用函数自身,执行递的动作。
最后一次判断一个终止条件,可以执行归的动作。
应用:阶乘
function test(){
if(n == 1){
return 1;
}
return n*test(n-1);
}
test(4);//24
深拷贝:
function deepcopy(obj){
if(typeof(obj) != 'object'){
return obj;
}
var newObj={};
for(var attr in obj){
newObj[attr]=deepcopy(obj[attr]);
}
return newObj;
}
var obj={a:{b:10}};
var obj2=deepcopy(obj);
obj2.a.b = 20;
alert(obj.a.b);//10