JS學習筆記 淺拷貝和深拷貝

2022-08-05 14:18:15 字數 1671 閱讀 8417

淺拷貝是指,在複製變數時,對於引用型別的變數,只拷貝其引用,不拷貝其在堆中的真實資料。深拷貝是指,拷貝堆中的資料,一個新的引用指向新拷貝出來的資料。

判斷淺拷貝還是深拷貝,一個很簡單的方法就是使用全等(===),當兩個物件進行比較時,只有指向同一個物件,結果才會是true。當向arr中push一個obj,全等的結果是true,說明兩個引用指向的是同一個物件,arr中儲存的是舊引用而不是新引用。當我們修改obj後,arr也會一起被修改。當對obj賦值null,由於obj不再是引用,而arr中還儲存有引用,所以他們不相等。

我原本以為執行obj=null之後,arr中儲存的物件也會沒掉,其實並不是。obj是引用,讓其等於null只是改變obj的指向,並不影響堆中的真實物件。由於堆中的真實物件還有arr對其引用,所以該物件不會被垃圾**。

var arr =;

var obj = };

arr.push(obj);

console.log(arr[0] === obj);//true

console.log(json.stringify(arr[0]));

console.log(json.stringify(obj));

obj.name = '123';

console.log(arr[0] === obj);//true

console.log(json.stringify(arr[0]));

console.log(json.stringify(obj));

obj = null;

console.log(arr[0] === obj);//false

console.log(json.stringify(arr[0]));

console.log(json.stringify(obj));

物件深拷貝的方法就是遍歷物件的屬性,並把屬性賦值給新物件。陣列是比較特殊的物件,在拷貝陣列的時候,需要初始化的是

function deep(src) ;

for(var key in src)

}return des;

}var des = deep(src);

上面這個拷貝方法會有一些問題:當物件的屬性還是物件的時候,該屬性物件會是淺拷貝。對於這種情況,我們可以遞迴地呼叫該方法。

function deep(src) ;

for(var key in src)

}return des;

}var des = deep(src);

jquery中的淺、深拷貝。第一個引數代表是否深拷貝,第二個引數是目的物件,第三個引數是要拷貝的源物件。

%.extend({}, src);//淺拷貝

%.extend(true, {}, src);//深拷貝

上面給出的深拷貝**解決了巢狀物件的問題,但如果屬性是函式的話,該屬性是淺拷貝,是對函式的引用。