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)
}
}){