对象的深拷贝与浅拷贝

var obj = {
	name:'zs',
	age:18,
	sex:'男'
}
var obj2 = {
	
}
// 遍历对象中的成员
for(var key in obj){
// 注意这里使用 obj.key 是错误的,因为这种格式是把key当做了obj对象中的属性来看待。但是for in 中的key 是变量  使用obj[key]这种形式就是将key当做变量来看的。所以obj.key换成obj[key]
	obj2[key] =  obj[key]
	// 这种方式修改 obj的成员,不会影响obj2
}
// 封装函数 把o1的成员,复制给o2
function copy(o1,o2){
	for(var key in o1){
		 o2[key] = o1[key]
	}
}
copy(obj1,obj2)
console.dir(obj2)

浅拷贝

var obj = {
	name:'zs',
	age:18,
	sex:'男',
	dog:{
		name:'大黄',
		age:2,
		color:'黄色'
	}
}
var obj2 = {}
function copy(o1,o2){
	for(var key in o1){
		 o2[key] = o1[key]
	}
}
// 如果我们修改obj1中的数据,看看obj2中数据是否跟着一块修改了。正常来说我们是不想让一块被修改的。因为毕竟是复制原有对象中的数据了,新开辟了一个内存空间
obj.name = 'lili'
obj.dog.name = '金毛'
console.log(obj2)
// 发现是obj2中的dog.name是改变了的,基本类型obj2.name是改变了的。这就出现了问题,并不是我们想要的结果
原因是?
在obj1中有一个dog对象,会在内存中又开辟了一个新的空间。obj1中的dog变量,其实只是一个地址,指向了内存中开辟的空间obj对象空间。此时我们复制了一份给了obj2,此时基本的属性是复制了,对于dog对象,只是将obj1中的存储的地址复制了一份给了obj2.name这时候obj1.dog和obj2.dog指向的都是空间中同一个内存地址。所以当obj1中的dog属性值发生改变的时候,obj2中的dog值也会发生改变。因为他们指向同一个地址空间。也叫浅拷贝。因为复制对象的时候,只能把第一层的对象中的属性复制过去。

深拷贝-拷贝对象的多层属性

function deepCopy(o1,o2){
	for(var key in o1){
		if(o1[key] instanceOf Array){
			o2[key] = []
			deepCopy(o1[key],o2[key])
		} else if(o1[key] instanceOf Object){
			o2[key] = {}
			deepCopy(o1[key],o2[key])
		}else {
			o2[key] = o1[key]
		}
	}
}
// 这里注意:数组也是对象。所以以上的顺序不能变,必须先判断是否是数组,然后再判断是否是对象
console.log(arr instanceOf Array)// true
console.log(arr instanceOf Array)// true

递归遍历DOM数

function loadTree(parent,callback){
	for(var i = 0; i< parent.children.length; i++){
			var child = parent.children[i]
			if(callback){
				callback(child)
			}
			loadTree(child)
	}
}
// 下面是使用函数做一个操作
var ul = document.getElementById('list')
loadTree(ul,function(element){
		element.onclick = function(){
		console.log(this.innerText)
	}
}){
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值