答案:
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 ...