淺拷貝是指,在複製變數時,對於引用型別的變數,只拷貝其引用,不拷貝其在堆中的真實資料。深拷貝是指,拷貝堆中的資料,乙個新的引用指向新拷貝出來的資料。
判斷淺拷貝還是深拷貝,乙個很簡單的方法就是使用全等(===),當兩個物件進行比較時,只有指向同乙個物件,結果才會是true。當向arr中push乙個obj,全等的結果是true,說明兩個引用指向的是同乙個物件,arr中儲存的是舊引用而不是新引用。當我們修改obj後,arr也會一起被修改。當對obj賦值null,由於obj不再是引用,而arr中還儲存有引用,所以他們不相等。
我原本以為執行obj=null
之後,arr中儲存的物件也會沒掉,其實並不是。obj是引用,讓其等於null只是改變obj的指向,並不影響堆中的真實物件。由於堆中的真實物件還有arr對其引用,所以該物件不會被垃圾**。
物件深拷貝的方法就是遍歷物件的屬性,並把屬性賦值給新物件。陣列是比較特殊的物件,在拷貝陣列的時候,需要初始化的是。
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);//深拷貝
上面給出的深拷貝**解決了巢狀物件的問題,但如果屬性是函式的話,該屬性是淺拷貝,是對函式的引用。 JS筆記 淺拷貝和深拷貝
淺度拷貝 複製一層物件的屬性,並不包括物件裡面的為引用型別的資料,當改變拷貝的物件裡面的引用型別時,源物件也會改變。如 var obj var obj1 obj console.log obj1.name 用函式封裝,淺拷貝 var obj2 function extend a,b 呼叫函式 ext...
JS深拷貝和淺拷貝
js中物件分為基本型別和復合 引用 型別,基本型別存放在棧記憶體,復合 引用 型別存放在堆記憶體中 堆記憶體中用於存放由new建立的物件,棧記憶體存放一些基本型別的變數和物件的引用變數 對於簡單變數,記憶體小,直接複製不會發生引用 var a 123 var b a a 123456 console...
JS淺拷貝和深拷貝
1.淺拷貝 copy var obj1 物件存放於堆記憶體中,物件中的鍵值對,值可以為物件,可以為陣列.var obj2 obj1 物件,陣列之間只有引用賦值 obj2.name 撒哈哈 當改動物件obj2的時候,obj1的key對應的value也會更改這是淺拷貝 深拷貝 var obj1 var ...