简述深浅拷贝原理
//数组浅拷贝
var arr=["xjz","is","a","superman"];
//slice
var new_arr=arr.slice();
new_arr[0]="zxb";
console.log("before:"+arr);
console.log("after:"+new_arr);
//concat
var new_arr=arr.concat();
new_arr[0]="bb";
console.log("before:"+arr);
console.log("after:"+new_arr);
//这个方法只能是拷贝基本类型 如果数组项是引用类型的话 只会拷贝引用
//所以当以后改变这个引用的时候 都会发生改变 很麻烦
//只是适用于存储基本类型的数组的拷贝
//深拷贝
//如果只是简单地数据类型 可以json解析
//function undefined null NAN Infinity 拷贝不了
var json=["xjz","super","man",{
"age":12,
"name":"xjz"
},function(){return "dadada"},undefined,null,NaN,Infinity];
var newJSON=JSON.parse(JSON.stringify(json));
所以还需要自己写一个拷贝 啊哈哈哈哈哈
//for in 不可以获取不可枚举的属性
//hasOwnProperty 会忽略原型链上的属性
//Object.getOwnPropertyNames 可以获取可枚举和不可枚举的属性
//深拷贝
function deepCopy(obj){
if(!(obj && typeof obj==="object")){
return;
}
else{
var copyResult = obj instanceof Array ?[]:{};
for(var key in obj){
if(obj.hasOwnProperty(key)){
copyResult[key]=typeof obj[key] ==="object"?deepCopy
(obj[key]):obj[key];
}
}
}
return copyResult;
}
var obj={
"data":[{"age":12},{"name":"xjz"},
{"adress":"ChangChun"}],
callBack:function(){
console.log("my love is zxb");
}
};