js中的深拷貝與淺拷貝

2022-05-24 14:15:12 字數 1982 閱讀 3665

一、初步區分深拷貝與淺拷貝   

js中有深拷貝與淺拷貝之說。什麼是深拷貝什麼是淺拷貝,簡單點來說:就是假設b複製了a,當修改a時,看b是否變化。如果b也跟著變化,就是淺拷貝。如果b沒有變,就是深拷貝。

二、深入了解

js中有基本資料型別與引用資料型別。

資料型別:number,string, boolean, null, undefined 五類。

引用資料型別(object類),無序物件,陣列[1,2,3]以及函式等。

1、基本資料型別 -- 可以算是深拷貝(名和值都存在棧記憶體中)

當b=a複製時,棧記憶體中會新開闢乙個記憶體:

所以當你此時修改a=2,對b並不會造成影響,可以說是深拷貝,但並非嚴格意義上的深拷貝。

2、引用資料型別(名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供乙個引用的位址指向堆記憶體中的值)

當b=a進行拷貝時,其實複製的是a的引用位址,而並非堆裡面的值。

而當a[0]=1時進行資料修改時,由於a和吧指向的是同乙個位址,所以b也受到了影響,這就是淺拷貝。

三、如何實現將淺拷貝變成深拷貝

1、遞迴法

遞迴法複製所有層級的屬性。

function

deepclone(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 影響,所以是深拷貝。

但是:

拷貝的不徹底啊,b物件的一級屬性確實不受影響了,但是二級屬性還是沒能拷貝成功,仍然脫離不了a的控制,說明slice根本不是真正的深拷貝。

2、json物件的parse和stringify

b不受a的影響,實現了深拷貝。

3、除了上面兩種方法之外,我們還可以借用jq的extend方法。

deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝

實現深拷貝。

js中的深拷貝與淺拷貝

今天面試被問到js中深淺拷貝的問題,當時回答的並不好,回來搜尋了一波,現做下總結 js中針對引用型別的拷貝分為兩種 深拷貝和淺拷貝 淺拷貝比較簡單,分為兩類,一類是直接對源物件進行拷貝,實際上就是引用型別的賦值,拷貝的僅僅是物件引用,如 var obj var newobj obj newobj.a...

JS中的深拷貝與淺拷貝

說到深淺拷貝的時候就不得不說一下js中的變數型別了 淺拷貝分兩種情況,拷貝源物件的引用和源物件拷貝例項,但其屬性拷貝引用.拷貝源的引用 eg let obj1 let obj2 obj1 console.log obj1 obj2 true obj1.a 2 console.log obj2.a 2...

JS中的深拷貝與淺拷貝

深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用,深拷貝的實現 1.通過遞迴解決 var a function deepcopy initobj,finalobj for var i in initobj if typeof initobj i object argume...