JS中的深拷貝與淺拷貝

2021-09-27 12:22:18 字數 2422 閱讀 7152

淺拷貝是物件的逐位複製。建立乙個新物件,該物件具有原始物件中值的精確副本。如果物件的任何欄位是對其他物件的引用,則只複製引用位址,即,複製記憶體位址。

大白話講就是,淺拷貝是對物件位址的複製,並沒有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變。

深拷貝複製所有字段,並複製欄位所指向的動態分配記憶體。深拷貝發生在物件及其引用的物件被複製時。

大白話講就是,深拷貝則是開闢新的棧,兩個物件對應兩個不同的位址,修改乙個物件的屬性,不會改變另乙個物件的屬性。

淺拷貝:它將x的引用複製到y中。因此,xy的位址是相同的,也就是說它們指向相同的記憶體位置。

深拷貝:複製x的所有成員,為y分配不同的記憶體位置,然後將複製的成員分配給y,實現深拷貝。這樣,如果x消失了,y在記憶體中仍然有效。

考慮下面的**:

var newobj = ;
假設你想建立乙個這個物件的副本,這樣即使原始值被改變了,仍然可以通過副本得到原始物件的值。

我會這樣做:

var copyobj = newobj; // 淺拷貝
如果咱們改變乙個值:

copyobj.name = 'dan';
這樣操作,咱們的原始物件 newobj的屬性name也會跟著改變,因為這裡是乙個淺拷貝。這樣咱們就獲取不到原始物件的值了。所以這種拷貝做法是不對的。

但是,通過使用原始newobj變數的屬性建立乙個全新的變數,就可以建立乙個深拷貝副本。

var copyobj = ; // 深拷貝
現在,如果更改copyobj.name,它只會影響copyobj,而不會影響newobj

object.assign()是咱們經常用到的方法,其實這個方法就是淺拷貝。但是它又有一點特殊的地方,就是可以處理第一層的深拷貝。

var newobj = 

};var copyobj = object.assign({}, newobj );

copyobj .name = 'mint'

copyobj .family.name = 'yyy'

console.log(newobj );

// }

console.log(copyobj );

// }

看上面的例子,屬性name的值並沒有跟著變,但是屬性中familyname的值跟著變了。

唯一的作法就是轉殖這個物件。

對於簡單的json物件,最簡單的方法是

var objectisnew = json.parse(json.stringify(objectisold));

//如果使用jquery,可以使用:

// 淺拷貝

var objectisnew = jquery.extend({}, objectisold);

// 深拷貝

var objectisnew = jquery.extend(true, {}, objectisold);

純js方法來深拷貝物件(並非最佳方法)

function keepcloning(objectpassed) 

// 臨時儲存原始的obj的構造

var temporary_storage = objectpassed.constructor();

for (var key in objectpassed)

return temporary_storage;

}var newobj = ;

var copyobj = (keepcloning(newobj));

newobj.name = "dan";

console.log(newobj);

console.log(copyobj);

了解深拷貝也不僅僅是為了應付面試題,在實際開發中也是非常有用的。例如後台返回了一堆資料,你需要對這堆資料做操作,但多人開發情況下,你是沒辦法明確這堆資料是否有其它功能也需要使用,直接修改可能會造成隱性問題,深拷貝能幫你更安全安心的去運算元據,根據實際情況來使用深拷貝,大概就是這個意思。

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...