淺轉殖與深轉殖

2021-10-21 02:05:00 字數 1094 閱讀 4898

一般實現陣列轉殖的方法都是淺轉殖,直接將儲存在棧中的值賦值給對應變數,如果是基本資料型別,則直接賦值對應的值,如果是引用型別,則賦值的是位址

slice:

let arr2 = arr1.slice(0);

concat:

let arr2 = arr1.concat();

擴充套件運算子[…ary]:

let arr2 = […arr1];

把資料賦值給對應的變數,從而產生乙個與源資料不相干的新資料(資料位址已變化)。深轉殖,是拷貝物件各個層級的屬性。

利用 json 資料格式:

語法:let arr2 = json.parse(json.stringify(arr1));

實現原理:

json.stringify(arr1):先把原始物件變為乙個字串(去除堆和堆巢狀的關係)

json.parse(…):在把字串轉換為新的物件,這樣瀏覽器會重新開闢記憶體來儲存資訊

缺點:對 數字/字串/布林/null/普通物件/陣列物件 等都沒有影響,可以使用,但json.stringify(arr1)並不是對所有的值都能有效處理:

正則會變成空物件

函式/undefined/symbol 都會變成null

日期格式資料變為字串後,基於parse 也回不到物件格式了

自己封裝:

思路:1、傳遞進來的是函式時,不需要操作,直接返回即可

因為在乙個執行環境棧中乙個名字的函式只能有乙個,如果我們自己又轉殖了乙個,會把原來的替換掉,這樣做沒有任何意義

2、傳遞進來的是基本資料型別時,不需要操作,直接返回即可

3、傳遞的是物件型別時

(1). 正則物件:建立乙個新的例項儲存當前正則即可(因為我們的目的讓空間位址不一樣即可)

(2). 日期物件:建立乙個日期例項儲存當前日期

(3). 普通物件&&陣列物件:建立乙個新的例項,迴圈儲存當前資訊;

普通物件&&陣列物件 中有可能還會存在多層巢狀的關係,所以這裡我們可以用下遞迴

**實現:

clonedeep

(obj)

return cloneobj;

}

淺轉殖與深轉殖

clone 方法是object中的乙個方法 淺轉殖 shallow copy employee cindy tobby.clone 深轉殖 deep copy 必須實現cloneable介面 class employee implements cloneable 如果物件中有引用型別,就必須使用深度...

深轉殖與淺轉殖

淺轉殖 被轉殖物件的所有變數都含有與原來物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺轉殖僅僅轉殖所考慮的物件,而不轉殖它所引用的物件。深轉殖 被轉殖物件的所有變數都含有與原來物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被轉殖的新物件,而不再是原有的那...

c 深轉殖與淺轉殖

我們都知道memberwiseclone 會將淺轉殖。什麼是淺轉殖?如何深轉殖呢?public class good private static good good private static good good new good public good createinstance publi...