拷贝就是把父对象的属性,全部拷贝给子对象。
1.浅拷贝
浅拷贝就是就是公用一个引用,一个改变会影响另一个
var obj = {
a : 10,
b : 20
};
function copy(obj) {
var newObj = {};
for (var i in obj) {
newObj[i] = obj[i];
}
return newObj;
}
var obj2 = copy(obj);
console.log(obj2.a);//10 成功复制了obj的a
obj2.a = 111; //更改obj2的a
console.log(obj2.a);//111 改变
console.log(obj.a);//10 不变 obj2的改变不影响obj 说明子元素只是拷贝了父元素的内存地址
2.深拷贝
所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。
//需求:打印出一个对象所有的属性值 包括对象中的数组或者对象中的对象属性,不要打印整体
var ls = {
name : "老王",
love : {
name : "web",
size : 10,
list : {
name1 : "html",
name2 : "javascrpt",
name3 : "css"
},
fun : ["ajax","jquery","json"]
}
}
//打印出所有的对象
/*for (var attr in ls) {
console.log(ls[attr]);
//思考:看当前的值是否是对象还是数组
//对象和数组的时候需要再次遍历
}*/
//思路 : 采用递归
function deepTravel(obj) {
for(var attr in obj) {
//需要判断,到底这个值是否是数组,还是普通的字符串/数组
//typeof arr是object,typeof obj还是Object
//采用for in 循环可以遍历数组和对象
//采用递归去深度遍历对象中的对象属性
if(typeof obj[attr] === "object") {
deepTravel(obj[attr]);
} else {
//不是对象,直接打印其值即可
console.log(attr + ":" + obj[attr]);
}
}
}
deepTravel(ls);//name:老王
// name:web
//size:10
//name1:html
//name2:javascrpt
//name3:css
//0:ajax
//1:jquery
//2:json
//深拷贝2
//对象的深拷贝
//oo原始对象 no新对象
//普通类型 string number 等 a = b
//当原始对象的某个属性是数组时 应该首先在新对象中创建数组
//当原始对象的某个属性是对象时 现在新对象中创建一个对象属性
//deepCopy(lw,{});
//第二个参数可选
function deepCopy2(oo,no) {
var no = no || {};//可以不传第二个参数
for (var i in oo) {
//代表这个原始对象的某一个属性是对象
if (typeof oo[i] === "object") {
//创建新的属性 数组或者对象
no[i] = oo[i].constructor === Array ? [] : {};
//将对象或数组的内容拷贝到新数组
//no[i]第一次是空对象或者空数组
deepCopy2(oo[i],no[i]);
} else {
no[i] = oo[i];//给新对象新增i对应的属性
}
}
return no;//返回新对象
}
console.log(deepCopy2(lw));