赋值
基本数据类型赋值,赋值之后两个变量互不影响
var dd = 89
var tt = dd
tt = 90
console.log(dd);//89
console.log(tt);//90
对引用类型进行赋址,两个变量指向同一个对象,改变变量 a 之后会影响变量 b,哪怕改变的只是对象 a 中的基本类型数据。
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
};
var o = {};
o = obj
o.msg.age = 8
console.log(o);
console.log(obj);//里面msg.age都是8
浅拷贝
浅拷贝只拷贝最外一层
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
};
var o = {};
//浅拷贝只拷贝最外一层
for (var k in obj) {
// k 是属性名 obj[k] 属性值
o[k] = obj[k];
}
console.log(o);
o.msg.age = 20;
console.log(obj);//第二层的数据会随着变化
obj.name = "jj";
console.log(o);
console.log(obj);//最外层的数据不会随着变化
//ES6写法
Object.assign(o, obj);
console.log(o);
o.msg.age = 20;
console.log(obj);//里面的层还是会随着变化
深拷贝
深拷贝拷贝多层
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
},
color: ['pink', 'red']
};
var o = {};
function deepCopy(newobj, oldobj){
for(i in oldobj){
var item = oldobj[i]
//判断是否为数组
if(item instanceof Array){
newobj[i] = []
deepCopy(newobj[i], item)
//判断是否为对象
}else if(item instanceof Object){
newobj[i] = {}
deepCopy(newobj[i], item)
}else{
//简单数据类型
newobj[i] = item;
}
}
}
deepCopy(o, obj);
console.log(o);
o.msg.age = 20;
console.log(obj);//不会相互影响
网友评论