js深浅拷贝

191 阅读1分钟

对不起晚来了,两天

就不多说废话了,咱们直接聊深浅拷贝

浅拷贝 只拷贝简单数据类型 当新对象里面的复杂数据类型的值发生变化的时候原对象也会跟着发生变化 普通对象赋值,当新对象的任何属性发生变化,原对象都会发生变化

var obj = {
  id: 1,
  uname: 'xiaohu',
  xh:{
  	play: 'nanqiu'
  },
  clor: ['pink', 'red']
};

先去实现,然后咱们再说优化

var o = {};
for (var k in obj) {
// // k是属性名,obj[k]是属性值
// o[k] = obj[k];
// // }
// Object.assign(o, obj); // Object.assign 是浅拷贝操作
// console.log(o);
// 封装函数
function deepCopy (newobj, oldobj){
for (var k in oldobj) {
// 判断我们的属性值属于哪种数据类型
// 1.获取我们的属性值 oldobj[k]
var item = oldobj[k];
// 2.判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = [];
// 相当于 o.clor = [];
deepCopy(newobj[k], item)
}else if(item instanceof Object){
// 3.判断这个是是否是对象
newobj[k] = {};
deepCopy(newobj[k], item);
}else{
// 4.简单数据类型
newobj[k] = item;
}

}
}
deepCopy(o, obj);
console.log(obj);
o.uname = 'sb';
o.xh.play = 'ssb';
</script>

还是老话理清思路实现功能

这个时候你就会觉得代码很臃肿

盘他!!

<script>
var bf = function (bos) {
var ar = bos instanceof Array ? [] : {};
for (var k in bos){
var vul = bos[k]
// console.log(vul);
ar[k] = vul !== null && typeof vul === 'objeck' ? bf(vul) : vul
}
return ar;
}
var x = {
a: 123,
b:{
name:"hu",
age:18
},
c:[1, 213, 42, 90],
d:undefined,
e:null
}
var y = bf(x);
console.log(y);

</script>

觉得没有更简单的了##狗头

深浅克隆要去理解他的还是地址问题,由于推迟了更新,所以明天我想跟大家讨论一下深浅克隆地址 栈内存和堆内存