js中的深拷貝和淺拷貝與值傳遞和引用傳遞有著些許的關聯,都是根據堆疊中資料的儲存來傳遞資料。
下面主要說一下我對深拷貝和淺拷貝的理解:
簡單舉個例子來說明;當我們宣告乙個a變數並且賦值,並且讓b等於a,因為a,b都是基本資料型別所以資料都是儲存在棧中,所以改變其中乙個變數的資料他們之間不會相互干擾的,這種拷貝就是深拷貝。而淺拷貝就是改變其中乙個變數或者物件等引數的值或者屬性,另外乙個變數或者物件等引數的值或者屬性也會發生變化。
深拷貝var a=8,b=a;
var b=9;
console.log(a,b); //8,9
堆疊儲存過程如下:
或者換一種情況:
var tal = new object();
function test(obj)
test(tal);
tal.name = 『kiki』;
console.log(tal); //
當我們建立tal物件的時候:
obj物件在函式中賦值的時候:
當函式呼叫之後,tal=obj,就是把obj的在棧中的位址付給物件tal,但是他們指向堆中的資料都是乙個堆的資料。
改變tal.name的時候:
這樣改變物件tal屬性的時候就是改變obj物件的屬性,這時候就是淺拷貝,無法做到改變tal資料,obj的資料不變。
如果想要深拷貝可以用以下兩種方法:
一、用json物件的parse和stringify
function test(obj)
var tal = ;
cal=test(tal);
cal.name = 『kiki』;
console.log(tal,cal); //
這樣就可以實現深拷貝,改變cal物件的屬性而不會改變tal物件的屬性。
二、用jquery中的extend
$.extend( [deep ], target, object1 [, objectn ] )
deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝
target object型別 目標物件,其他物件的成員屬性將被附加到該物件上。
object1 objectn可選。 object型別 第乙個以及第n個被合併的物件。
var tal = ;
cal=$.extend(true,{},tal);
tal.name=『kiki』;
console.log(tal,cal); //
這樣也可以實現深拷貝,深拷貝的作用一般就是多個人開發乙個專案需要使用介面返回的相同資料,但是又不能相互干擾,這時候需要把資料進行深拷貝,從而對拷貝後的資料進行操作,以免影響原始資料。
深拷貝和淺拷貝
淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...
淺拷貝和深拷貝
以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...
深拷貝和淺拷貝
ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...