剖析js中的浅拷贝&&深拷贝&&DOM树

浅拷贝:拷贝就是复制,就相当于把一个对象中的所有的内容,复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或者方法,都可以使用。

var obj1={
  age:10,
  sex:"男",
  car:["奔驰","宝马","特斯拉","奥拓"]
};
//另一个对象
var obj2={};

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

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

var obj1={
  age:10,
  sex:"男",
  car:["奔驰","宝马","特斯拉","奥拓"],
  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)

==============================================================

  //获取页面中的根节点--根标签
  var root=document.documentElement;//html
 //函数遍历DOM树
 //根据根节点,调用fn的函数,显示的是根节点的名字
 function forDOM(root1) {
   //调用f1,显示的是节点的名字
  // f1(root1);
     //获取根节点中所有的子节点
var children=root1.children;
//调用遍历所有子节点的函数
forChildren(children);
  }

 //给我所有的子节点,我把这个子节点中的所有的子节点显示出来
  function forChildren(children) {
//遍历所有的子节点
for(var i=0;i

}

    //函数调用,传入根节点
   forDOM(root);
   function f1(node) {
   console.log("节点的名字:"+node.nodeName);
 }

节点包括:nodeName,nodeType,nodeValue

  第一个函数:给我根节点,我会找到所有的子节点:forDOM(根节点)
  获取这个根节点的子节点
  var children=根节点的.children
   调用第二个函数
  第二个函数:给我所有的子节点,我把每个子节点的名字显示出来(children)
for(var i=0;i

你可能感兴趣的:(剖析js中的浅拷贝&&深拷贝&&DOM树)