含義:假設b複製了a,當修改a時,看b是否會發生變化,如果b也跟著變了,說明這是淺拷貝,如果b沒變,那就是深拷貝。
關於棧堆,就要了解基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝
let a=[0,1,2,3,4],b=a;
console.log(a===b); //
true
a[0]=1;
console.log(a,b); 1,1,2,3,4
明明b複製了a,為啥修改陣列a,陣列b也跟著變了,這裡我不禁陷入了沉思
那麼這裡,就得引入基本資料型別與引用資料型別的概念了。
基本資料型別有哪些,number,string,boolean,null,undefined五類。
引用資料型別(object類)有常規名值對的 無序物件,陣列[1,2,3],以及函式等。
當b=a進行拷貝時,其實複製的是a的引用位址,而並非堆裡面的值。
要是在堆記憶體中也開闢乙個新的記憶體專門為b存放值,就像基本型別那樣,豈不就達到深拷貝的效果了
2.我們怎麼去實現深拷貝呢,這裡可以遞迴遞迴去複製所有層級屬性。
functiondeepclone(obj);
if(obj && typeof obj==="object")
else}}
}return
objclone;
}
let a=[1,2,3,4],
b=deepclone(a);
a[0]=2;
console.log(a,b);
b脫離了a的控制,不再受a影響了。
這裡強調,深拷貝,是拷貝物件各個層級的屬性。
jq裡有乙個extend方法也可以拷貝物件,我們來看看
let a=[1,2,3,4],b=a.slice();
a[0]=2;
console.log(a,b);
是不是說slice方法也是深拷貝了,畢竟b也沒受a的影響,上面說了,深拷貝是會拷貝所有層級的屬性,還是這個例子,我們把a改改
let a=[0,1,[2,3],4],b=a.slice();
a[0]=1;
a[2][0]=1;
console.log(a,b);
a 輸出 [1,1,[1,3],4]
b 輸出 [0,1,[1,3],4]
拷貝的不徹底啊,b物件的一級屬性確實不受影響了,但是二級屬性還是沒能拷貝成功,仍然脫離不了a的控制,說明slice根本不是真正的深拷貝。
第一層的屬性確實深拷貝,擁有了獨立的記憶體,但更深的屬性卻仍然公用了位址,所以才會造成上面的問題。
同理,concat方法與slice也存在這樣的情況,他們都不是真正的深拷貝,這裡需要注意。
3.除了遞迴,我們還可以借用json物件的parse和stringify
functiondeepclone(obj)
let a=[0,1,[2,3],4],
b=deepclone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
a 輸出 [1,1,[1,3],4]
b 輸出 [0,1,[2,3],4]
這下b是完全不受a的影響了。
附帶說明,json.stringify
與json.parse
除了實現深拷貝,還能結合localstorage
實現物件陣列儲存。
有興趣可以閱讀部落格這篇文章 localstorage儲存陣列,物件,localstorage,sessionstorage儲存陣列物件
4.除了上面兩種方法之外,我們還可以借用jq的extend方法。
$.extend( [deep ], target, object1 [, objectn ] )
deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝
target 為object型別 目標物件,其他物件的成員屬性將被附加到該物件上。
object1 objectn可選。 object型別 第乙個以及第n個被合併的物件。
let a=[0,1,[2,3],4],b=$.extend(true
,,a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
a 輸出 [1,1,[1,3],4]
b 輸出 [0,1,[2,3],4]
可以看到,效果與上面方法一樣,只是需要依賴jq庫
實際開發中也是非常有用的,後台返回了一堆資料,你需要對這堆資料做操作,但多人開發情況下,你是沒辦法明確這堆資料是否有其它功能也需要使用,直接修改可能會造成隱性問題,深拷貝能幫你更安全安心的去運算元據,根據實際情況來使用深拷貝,大概就是這個意思。
淺拷貝與深拷貝講解
如果b複製了a,修改b時如果a也跟隨b發生改變,那麼這個就是淺拷貝,舉個在生活中的例子,就好比一台電腦,被人遠端連線了,雖然感覺是變成了兩個電腦而且都有相同的內容,但是其實電腦的內容存在的硬碟是乙個,不管是遠端連線的人對電腦進行修改還是本機進行修改,都會影響雙方的電腦。如果b複製了a,修改b,a沒用...
淺拷貝和深拷貝以及陣列去重示例
1.淺拷貝 var obj1 var obj2 淺拷貝只拷貝第一層屬性,引用型別資料位址是相同的 因此存在資料共享問題 遍歷obj1 for var key in obj1 深拷貝 解決資料共享問題 function deepcopy source,target 判斷是陣列還是物件 deepcopy...
淺拷貝 深拷貝
copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...