生活随笔
收集整理的這篇文章主要介紹了
关于深拷贝和浅拷贝
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.淺拷貝
JavaScript存儲對象都是存地址的,所以淺復制會導致 a 和 b 指向同一塊內存地址
數組的賦值其實相當于給了索引,改變其中一個變量其他引用都會改變
var?a?=?[1,2,3];?? var?b?=?a;?? b[0]?=?4;?? //a為4?2?3?? //b為4?2?3?? var a = [1,2,3];
var b = a;
b[0] = 4;
//a為4 2 3
//b為4 2 3
?
根據上面存儲對象的問題,這里就可以解決另一個問題:
? ??原始參數(比如一個具體的數字)被作為值傳遞給函數;值被傳遞給函數,如果被調用函數改變了這個參數的值,這樣的改變不會影響到全局或調用函數。
? ? 你傳遞一個對象(在js里數組不是簡單數據類型,而是對象)到一個函數,如果在函數里面改變了這個參數的內容,在外部這個變化是可見的。
?
2.深拷貝
?
(1)slice 函數
(2)concat 函數
(3)assgin
?
三個函數的原理都是返回數組的一個副本(相當于另外開辟內存空間),所以并不會改變數組本身的的值
?
但是這里有一點不同,就是assgin與其他兩點的不同
雖然說assgin也是深拷貝,但是他只是第一層深拷貝,第二層之后還是進行淺拷貝,例子如下:
var?a?=?{?? ????a1:{?? ????????aa1:'11',?? ????????aa2:'22'?? ????}?? }?? var?b?=?object.assgin({},a);?? var?c?=?object.assgin({},a);?? b.a1.aa1?=?33;?? /*?? b:{?? ????a1:{?? ????????aa1:'33',?? ????????aa2:'22'?? ????}?? }?? c:{?? ????a1:{?? ????????aa1:'33',?? ????????aa2:'22'?? ????}?? }?? */?? var a = {a1:{aa1:'11',aa2:'22'}
}
var b = object.assgin({},a);
var c = object.assgin({},a);
b.a1.aa1 = 33;
/*
b:{a1:{aa1:'33',aa2:'22'}
}
c:{a1:{aa1:'33',aa2:'22'}
}
*/
?
轉載于:https://www.cnblogs.com/mei123/p/8548772.html
總結
以上是生活随笔 為你收集整理的关于深拷贝和浅拷贝 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。