js高级—理解浅拷贝和深拷贝

1、浅拷贝只是拷贝一层,更深一层对象级别的值拷贝引用。也就是拷贝了内存地址。
2、深拷贝拷贝多层,每一级别的数据都会拷贝。也就是会重新开辟一个新的空间进行存储,修改的话不会影响原数据。
浅拷贝案例代码:

//案例一 只拷贝一层
var obj = {
     
	id:1,
	name:'lisi'
}
var newObj={
     }
//应用for in 遍历对象
for(var k in obj){
     
//k是属性名 也就是id、name
//obj[k]属性值 得到的就是对象里面的1、lisi
	newObj[k] = obj[k];
}
console.log(newObj) 

打印结果:
在这里插入图片描述
更深一层的对象拷贝,虽然也可以拷贝,但是拷贝的是原来对象的地址。如下案例:

//案例二 更深层次的对象级别拷贝
var obj = {
     
	id:1,
	name:'lisi'
	msg:{
     
  		age:18
  }
}
var newObj={
     }
//应用for in 遍历对象
for(var k in obj){
     
	newObj[k] = obj[k];
}
console.log(newObj);
newObj.msg.age = 20; // 修改新对象里面的值,会影响原对象的值
console.log('---obj打印结果如下---');
console.log(obj);

打印结果
js高级—理解浅拷贝和深拷贝_第1张图片
以上案例使用原生js方法,可以使ES6的新增方法实现一句话搞定浅拷贝。

// 第一个参数为要拷贝给谁  第二个参数为 要拷贝哪一个对象
Object.assign(newObj, obj); //  实现效果和上面的一样

利用函数递归的思想来实现深拷贝
深拷贝案例代码:

var obj1 = {
     
	id: 1,
	name: 'lisi',
	msg: {
     
		age: 18,
	},
	color: ['red', 'green'],
};
var obj2 = {
     };
// 封装函数
function deepCope(newObj, oldobj) {
     
	for (var k in oldobj) {
     
	//判断属性值属于那种数据类型
	// 1、获取属性值 oldobj[k]
	var item = oldobj[k];
// 2、判断这个值是否是数组 要先判断数组 因为数组也是属于对象型
	if (item instanceof Array) {
     
		newObj[k] = [];// 相当于obj2.color = [] 也就是说这个属性里面传的必须是一个数组
		deepCope(newObj[k], item);
	} else if (item instanceof Object) {
     
		// 3、判断这个值是否是对象
		newObj[k] = {
     };
		deepCope(newObj[k], item);
	} else {
     
		// 4、属于简单数据类型
		newObj[k] = item;
	}
  }
}
deepCope(obj2, obj1); // 调用函数 并传入要拷贝的对象
console.log(obj1);
obj2.msg.age = 20;
console.log('---修改后obj2打印结果如下---');
console.log(obj2);

打印结果:
js高级—理解浅拷贝和深拷贝_第2张图片
可以看出修改后未改变原对象的值。

你可能感兴趣的:(javascript,node.js,vue.js)