淺拷貝和深拷貝

2021-09-17 22:29:38 字數 2275 閱讀 5962

淺拷貝:將原物件或原陣列的引用直接賦給新物件,新陣列,新物件/陣列只是原物件的乙個引用

淺拷貝只是指向被複製的記憶體位址,原位址的物件發生改變,那麼淺複製出來的值也會發生改變

深拷貝:建立乙個新的物件和陣列,將原物件的各項屬性的「值」(陣列的所有元素)拷貝過來,是「值」而不是「引用」

開闢了一塊記憶體位址用於存放複製的物件

*淺拷貝和深拷貝的區別在於是否真正的獲取了乙個物件的複製而不是引用

1.引用只發生在物件身上

// 這種不算是深淺拷貝,只是複製

var arr1=[1,2,3];

var arr2=arr1;

arr1.push(4);

alert(arr1); //1234

alert(arr2); //1234

2.slice(start,end) 不帶引數相當返回新陣列 從已有陣列中擷取一部分元素片段成新陣列(不改變原陣列)

var array = [1, 2, 3, 4];

var copyarray = array.slice();

copyarray[0] = 100;

console.log(array); // [1, 2, 3, 4]

console.log(copyarray); // [100, 2, 3, 4]

3.concat() 用於連線兩個或者多個陣列 不改變原陣列,返回乙個被連線陣列的副本

var array = [1, 2, 3, 4];

var copyarray = array.concat();

copyarray[0] = 100;

console.log(array); // [1, 2, 3, 4]

console.log(copyarray); // [100, 2, 3, 4]

4.es6

// (1) array.from(要複製的陣列)  把乙個類陣列或者可遍歷物件轉換成乙個真正的陣列

var arr1=[1,2,3];

var arr2=array.from(arr1);

arr1.push(4);

alert(arr1); //1234

alert(arr2); //123

// (2) ...擴充套件運算子 取出引數物件中所有可遍歷屬性拷貝到當前物件中

var arr1=[1,2,3];

var arr2=[...arr1];

arr1.push(4);

alert(arr1); //1234

alert(arr2); //123

// object.assign(target, source1, source2) 用於物件的合併,將源物件(source)的所有可列舉屬性,複製到目標物件(target),並返回合併後的target

var obj =

var copyobj = object.assign({}, obj);

copyobj.name = '我才不是! 哼 (。・`ω´・)';

console.log(obj); //

console.log(copyobj); //

5.不僅拷貝第一層級,還能夠拷貝陣列或物件所有層級的各項值

不是單獨針對陣列或物件,而是能夠通用於陣列,物件和其他複雜的json形式的物件

// json.parse(json.stringify(***x))  一招鮮吃遍天

var array = [,,

];var copyarray = json.parse(json.stringify(array))

copyarray[0].number = 100;

console.log(array); // [, , ]

console.log(copyarray); // [, , ]

// 通過immutable引入的一套api,實現

// 在改變新的陣列(物件)的時候,不改變原陣列(物件)

// 在大量深拷貝操作中顯著地減少效能消耗

const = require('immutable')

const map1 = map()

const map2 = map1.set('b', 50)

map1.get('b') // 2

map2.get('b') // 50

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 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...