浅拷贝:拷贝就是复制,就相当于把一个对象中的所有内容复制一份给另一个对象,直接复制,或者说,就是把一个对象的地址给了另一个对象,他们指向相同,两个对象之间有共同的属性或方法,都可以使用。
把一个对象中的属性复制到另一个对象中
// 浅拷贝
function extend(obj1,obj2){
for(var key in obj1){
obj2[key] = obj1[key];
}
}
如果拷贝的对象中有属性是数组或者是对象,那么拷贝过来的是属性对应的地址,也就是说,如果更改了这个属性对应的值,拷贝过去的对象值也会做相应的更改。
深拷贝:给每一个属性值开辟了一个新的空间用来存储,更改对象对拷贝后的对象不会有影响。
// 深拷贝
function extend2(Obj1, Obj2) {
for (var key in Obj1) {
var item = Obj1[key]
if (item instanceof Array) {
Obj2[key] = [];
extend2(item, Obj2[key]);
} else if (item instanceof Object) {
Obj2[key] = {};
extend2(item, Obj2[key]);
} else {
Obj2[key] = Obj1[key];
}
}
}
一个栗子
var a = {
age:10,
name:'小李',
car:['宝马','奥迪'],
dog:{
name:'小黄',
eat:'狗粮'
}
};
var b = {};
extend1(a,b);
// extend2(a,b);
a.dog.name = '小红';
a.age = 22;
console.log(a);
console.log(b);
如上面的代码,如果更改a的age属性,那么不管是深拷贝还是浅拷贝,b中对应的age的值是不会改变了,但是,如果更改了a.dog.name,浅拷贝对应的b对象的b.dog.name也会做相应的改变,但是深拷贝对应的b对象就不会做改变。
一个栗子:遍历DOM树
var root = document.documentElement;
//根据根节点找到所有的子节点
function forNode(root){
var child = root.children;
forChild(child)
}
//根据子节点数组,输出所有的子节点
function forChild(childList){
for(var i = 0;i<childList.length;i++){
var child = childList[i];
consNodeName(child);
//判断某个子节点是否还有子节点,其实这个地方我觉得可以直接调用forChild(child.children)
child.children&&forNode(child);
}
}
//根据节点,显示该节点
function consNodeName(child){
console.log(child.nodeName);
}
forNode(root);
网友评论