关于JavaScript中的深浅拷贝

拷贝:意思就是将目标完全复制一份。
尽管JavaScript是一门弱类型语言,但是存在着基本类型和引用类型,所以也导致JS中存在着浅拷贝(shallow copy)和深拷贝(deep copy)。

例如:JavaScript中String Boolean Number这些基本类型是值传递,对象则是引用传递

值传递:
var a = 123;
var b = a;
b = 666;
console.log(a);//123
console.log(b);//666

引用传递:


function clone(obj){
        var o={};

            for(var k in obj){
                o[k]=obj[k]    ;
        }
        return o;
    }

var p={
    name:'jim',
    car:{
        name:'lexus',
    }

};

var p1=clone(p);

console.log("p.name:"+p.name+",p.car.name:"+p.car.name);  //输出 p.name:jim,p.car,name:lexus
console.log("p1.name:"+p1.name+",p.car.name:"+p1.car.name);//输出 p1.name:jim,p1.car,name:lexus

console.log("----------------------------------------------------");
p1.name='tom';
p1.car.name='honda';

console.log("p.name:"+p.name+",p.car.name:"+p.car.name);//输出 p.name:jim,p.car.name:honda
console.log("p1.name:"+p1.name+",p.car.name:"+p1.car.name);//输出 p1.name:tom,p.car.name:honda

从上面的两个例子我们很容易看出,当我们在做拷贝的时候,基本类型将栈中的地址值就行了复制,没有开辟新的栈,所以内存中只有一个地址值。就如例子中,p和p1指向的就是同一个地址,所以p中的name的地址和p1中name的地址一致,修改任一一个对象的内容另一个对象的内容已将发生改变,打印出来的结果仍然是jim。

而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。