什麼是深 淺拷貝,有哪些實現方式

2021-10-06 04:14:29 字數 2451 閱讀 6726

答案:

js資料型別分為基本資料型別引用資料型別,基本資料型別儲存的是,引用型別儲存的是引用位址(this指標)。淺拷貝共用乙個引用位址,深拷貝會建立新的記憶體位址。

淺拷貝方法

深拷貝

詳細解析:

基本資料型別:string、number、boolean、undefined、null

引用資料型別:object、array、function

淺拷貝,拿人手短,變了;深拷貝,自食其力,不變。

一、淺拷貝

1. 直接物件複製

let a = [0,1,2,3,4],

b = a;

console.log(a === b);

a[0] = 1;

console.log(a,b);

結果:

2. object.assign:實現淺拷貝及一層的深拷貝

物件的合併  es6中的 object.assign(),第乙個引數必須是個空物件。

object.assign() 方法可以把任意多個的源物件自身的可列舉屬性拷貝給目標物件,然後返回目標物件。

注意點!嚴格來說,object.assign()  既不是深拷貝,也不是淺拷貝——而是第一級屬性深拷貝,第一級以下的級別屬性淺拷貝

let obj1 = ,

c: 2

}let obj2 = object.assign({},obj1)

obj2.a.b = 3; //第二層,obj1變了,是淺拷貝

obj2.c = 3; //第一層,obj1不變,是深拷貝

console.log(obj1);

console.log(obj2);

結果:

二、深拷貝

1. json.stringify轉為字串再json.parse

json.stringify把物件轉成字串,再用json.parse把字串轉成新的物件

function deepclone(obj) 

let a = [0, 1, [2, 3], 4]

let b = deepclone(a)

a[0] = 1

a[2][0] = 1

console.log(a) // [1,1,[1,3],4]

console.log(b) // [0,1,[2,3],4]

結果:

缺點:當值為undefined、function、symbol 會在轉換過程中被忽略

2. 深度遞迴遍歷

基本思路:判斷obj 是基本型別就簡單賦值,物件(陣列)的話 ,建立乙個空[ ](obj是物件)或空(obj是物件),再判斷obj的屬性有沒有物件(陣列),有遞迴呼叫,沒有簡單賦值,直到全部賦值完畢,返回賦值後的objclone

function deepclone(obj)  //根據型別製造乙個新的陣列或物件 array.isarray判斷是否是陣列

if (obj && typeof obj === 'object') else }}

} return objclone}

let a = [1,2,3,4]

let b = deepclone(a)

a[0] = 2

console.log(a) // [2,2,3,4]

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

結果:

3. jquery實現深拷貝

jquery 提供乙個$.extend可以用來做深拷貝;

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

var array2 = $.extend(true,,array1); // true為深拷貝,false為淺拷貝

console.log(array1 === array2); // false

什麼是js深拷貝和淺拷貝 有哪些實現方式?

var m var n m n.a 15 這時m.a的值是多少m.a會輸出15,因為這是淺拷貝,n和m指向的是同乙個堆,物件複製只是複製的物件的引用。深拷貝和上面淺拷貝不同,就是徹底copy乙個物件,而不是copy物件的引用,例如,還是之前的例子,我們這麼寫 var m var n n.a 15 這...

C 什麼是深淺拷貝,深淺拷貝的區別?

淺拷貝 class string string const string s str s.str string operator const string s 返回引用是為了連續的賦值 return this string 防止野指標的出現 str null char str get void st...

JS深淺拷貝的多種實現方式

通過for迴圈遍歷 let obj2 for let key in obj 通過 擴充套件運算子 let obj2 概念 開闢一塊新的記憶體空間,複製要拷貝的資料至新建立的記憶體空間,兩個資料結構的增刪改查互不干擾。使用json的函式 不適用於物件中含有函式 正則 日期 let obj2 json ...