一、遇到的問題:
寫了以下的一段js
var a = [a,b,c];
var c = a;
c.push(d);
然後console.log(a);會發現a中也多了d;
二、查詢資料並找到原因:
因為在js中,物件和陣列都是引用傳遞,所謂引用傳遞就是當變數
c賦值為陣列
a後,
a和c便指向了同乙個位址,這個位址的值便是
[a,b,c]這個陣列,所以當修改c
,也就是修改了c指
向位址的陣列,而
a也指向這個陣列,所以
a的值也會跟著變化
三、總結:
js中的賦值是分為深層拷貝以及淺層拷貝的,我們通常所用的「=」賦值,其實都是屬於淺拷貝,也就是如圖所示:
而如果想達到值傳遞的效果,也就是改變c而不引起a的改變,則可以使用json解析反解析的方式實現,具體使用如下:c = json.parse(json.stringify(a));也就達到了如圖所示的效果:
JavaScript中的深拷貝和淺拷貝
通俗的說,二者之前最大的不同就是它們的賦值方式。深拷貝的賦值方式就是值賦值,淺拷貝的賦值方式就是物件賦值。下面具體寫兩個例子來使你更加易懂。深拷貝 let a 5 let b a b 10 console.log a 輸出a 5 console.log b 輸出b 10 a和b的值是各自的,互相並沒...
javascript中的深拷貝和淺拷貝?
一 jquery的 extend 淺拷貝與深拷貝 extend deep target,object1 objectn deep 型別 boolean 如果是true,合併成為遞迴 又叫做深拷貝 target 型別 object object1 型別 object 乙個物件,它包含額外的屬性合併到第...
javascript中的深拷貝和淺拷貝
前拷貝 var obj var obj1 for var i in obj console.log obj1 深拷貝 var obj 封裝深拷貝 function deepcopy obj,obj1 else 在利用遞迴處理 複雜型別陣列 deepcopy obj key obj1 key var ...