单独存在的---浅拷贝、深拷贝、遍历DOM树(27)

浅拷贝

浅拷贝: 拷贝就是复制,就相当于把一个对象中的所有内容都复制一遍给另一个对象;
就是把一个对象的地址 给了另一个对象的,他们指向相同;两个对象之间有共同的属性和方法,都可以使用.
Eg:

var obj1={
	age:10,
	sex:'男',
	car:['奔驰','宝马','特斯拉','byd']
};

var   obj2={};

// 写一个函数,作用: 把一个对象的属性复制到另一个对象中,浅拷贝
// 把a对象中的所有属性复制到对象b中
function extend(a,b){
	for(var key in a){
		b[key]=a[key];
	}
}
extend(obj1,obj2);
console.dir(obj2);
cosnole.dir(obj1);

深拷贝 ======>递归

深拷贝: 还是复制,深:把一个对象中所有的属性或者方法,一个一个的找到,并且在另一个对象中开辟相应的空间,
一个一个的存储到另一个的对象中

var obj1={
	age:10,
	sex:'男',
	car:['奔驰','奥迪','byd','五菱'],
	dog:{
		name:'二傻',
		age:5,
		color:'黑白色'
	}
};

var obj2={}; //  空对象
// 通过函数实现把对象a中的所有数据深拷贝到对象b中
function extend(a,b){
	for(var key in a){
		// 先获取a对象中每个属性的值
		var item=a[key];
		// 判断这个属性的值 是不是  数组
		if(item instanceof Array){
			// 如果是数组,那么在b对象中添加一个新的属性,并且这个属性的值 也是数组;
			b[key]=[];
			// 调用这个方法  把a对象中这个数组的属性值一个一个的赋值到b对象的这个数组中
			extend(item,b[key]);
		}else if(item instanceof Object){ // 判断 这个属性的值 是不是对象
			// 如果是对象类型,那么在b对象中添加一个属性是一个空对象
			b[key]={};
			// 再次调用这个函数,把a对象中的属性对象 值一个一个的复制到b对象的 属性对象中
			extend(item,b[key]);
		}else{
			// 如果这个属性值  是普通数据,则直接把这个值复制到b对象的属性中
			b[key]=item;
		}
	}
}
extend(obj1,obj2);
console.dir(obj1);
console.dir(obj2); 

遍历DOM树====>递归

// 1,获取页面中的根节点 
var root=document.documentElement;
// 2,函数遍历DOM树
function forDom(root1){
	// console.log('节点名字'+root1.nodeName);
	// 调用f1,显示节点的名字
	f1(root1);
}
forDom(root); // 函数调用  传入根节点
function f1(node){
	console.log('节点名字:'+node.nodeName);
}
--------------------------------------------------------------
function forDom(root1){
	// console.log('节点名字'+root1.nodeName);
	// 调用f1,显示节点的名字
	f1(root1);
	// 获取根节点中所有的子节点
	var children=root1.children;
	// 调用遍历 所有子节点的函数
	forChildren(children);
}
// 给你子节点,  把这个子节点中的所有子节点获取出来
function  forChildren(children){
	// 遍历所有的子节点
	for(var i=0;i<children.length;i++){
		// 每个子节点
		var child=children[i];
		// 显示每个 子节点的名字
		f1(child);
	}
}
forDom(root); // 函数调用  传入根节点
function f1(node){
	console.log('节点名字:'+node.nodeName);
}
-----------------------------------------------------
function forDom(root1){
	// console.log('节点名字'+root1.nodeName);
	// 调用f1,显示节点的名字
	// f1(root1);
	// 获取根节点中所有的子节点
	var children=root1.children;
	// 调用遍历所有子节点的函数
	forChildren(children);
}
// 给出所有子节点,  把这个子节点中的所有子节点获取出来
function  forChildren(children){
	// 遍历所有的子节点
	for(var i=0;i<children.length;i++){
		// 每个子节点
		var child=children[i];
		// 显示每个 子节点的名字
		f1(child);
		// 判断 child 下面 有没有子节点,如果有,那么就继续遍历
		child.children&&forDom(child);
	}
}
forDom(root); // 函数调用  传入根节点
function f1(node){
	console.log('节点名字:'+node.nodeName);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值