對象的深淺拷貝

js是一門弱類型語言,ECMAScript指出數據類型主要:基本類型值和引用類型值。基本類型值指的是簡單的數據段;引用類型值指由多個值構成的對象。當咱們把變量賦值給一個變量時,解析器首先要作的就是確認這個值是基本類型值仍是引用類型值。javascript

在看具體分類以前須要明確:js只能操控棧,不能操控堆(是不是這麼說?)html

基本數據類型有如下幾種:java

number,string,boolean,undefined,null 這五種json

基本數據類型能夠直接操做保存在變量中的實際值,當變量自己發生變化時不對拷貝值形成影響。也就是直接在棧中操做。瀏覽器

如:spa

var a = 10;
var b = a; //b是a的拷貝
a = 20; //變量a發生變化
console.log(b);  //10

引用數據類型:——修改原始引用會對其餘應用產生影響code

array,function,object。 這幾種引用數據類型,實際上存在於堆中,棧中保留的只是堆中的引用。經過棧中的引用很容易找到堆中保留的原始數據。htm

如:對象

var obj = {name:"wuya"};
var obj2 = obj;
obj.name = "";
console.log(obj2.name);  //""

直接賦值的方式就是所謂的淺拷貝。blog

若是咱們想原始引用不影響拷貝,即所謂的深拷貝,就須要處理下。

實現一:

function clone(obj){
    if(typeof obj != obj || obj == null){  //注意:typeof null == 'object'
        return obj;      
    }    
    var temp = obj.constructor();   
    for(var key in obj){
        temp[key] = clone(obj[key]);  
    }
   return temp;
}
var obj = {name:"wuya"};
var obj2 = clone(obj);
obj.name = '';
console.log(obj2.name); //wuya

實現二:

var bob = {
    name: "Bob",
    age: 32
};
 
var bill = (JSON.parse(JSON.stringify(bob)));
bill.name = "Bill";
 
console.log(bob);
console.log(bill);

若是瀏覽器不支持JSON.stringify,引入json.org庫就行

參考:

1.http://heyjavascript.com/4-creative-ways-to-clone-objects/

2.http://www.cnblogs.com/pigtail/archive/2012/06/29/2569601.html

相關文章
相關標籤/搜索