对象的复制:
深拷贝和浅拷贝:
浅拷贝:在引用变量赋值给另一个变量时,引用的是一个堆内存地址,当一个变量改变时,另一个变量跟着改变
深拷贝:在引用变量赋值给另一个变量时,开辟了一个新堆内存地址,当一个变量改变时,另一个变量不改变
1.自己遍历,实现深拷贝
例:
var x=[1,2,3];
var y=[];
for(var i=0;i<x.length;i++){
y.push(x[i]);
}
x[0]=66;
console.log(x);//[66,2,3]
console.log(y);//[1,2,3]
例:
var obj={age:23,name:"zhang"}
var o={}
for(var v in obj){
o[v]=obj[v]
}
obj.name="li";
console.log(obj);//{age: 23, name: 'li'}
console.log(o);//{age: 23, name: 'zhang'}
2.借助数组的函数,凡是可以返回新数组的函数,都可以执行复制
例如:
var x=[1,2,3];
var y=x.concat();
x[0]=66;
console.log(x);//[66,2,3]
console.log(y);//[1,2,3]
3.借助Object对象下的方法
var obj={age:23,name:"zhang"}
var o=Object.assign(obj);//复制对象,实现浅拷贝
obj.name="li";
console.log(obj);//{age: 23, name: 'li'}
console.log(o);//{age: 23, name: 'li'}
var obj={age:23,name:"zhang"}
var o=Object.create(obj);//创建对象,实现深拷贝
o.name="wang";
obj.name="li";
console.log(obj);//{age: 23, name: 'li'}
console.log(o);//{name:'wang'}
4.ES6下的扩展运算符(...)
var x=[11,22,33];
// console.log(x[0],x[1],x[2])//11 22 33
// console.log(...x);//11 22 33
var y=[...x];
x[0]=66;
console.log(x);//[66,22,33]
console.log(y);//[11,22,33]
5.Json数据格式
JSON.parse()//json转成对象
JSON.stringify()//对象转json
缺点:对象的属性如果是symbol类型是无法复制的
var obj={name:"li",color:["red","blue"],y:{a:1,b:2}};
var json=JSON.stringify(obj);
var o=JSON.parse(json);
obj.name="wang";
console.log(obj);//{name wang}
console.log(o);//{name li}
o和obj是深拷贝