一、基本概念
深拷貝和淺拷貝是針對引用類型變數而言的。在JavaScript中,我們知道基本數據類型是按值傳遞的,而引用數據類型則是按引用傳遞,也就是說,引用類型變數存儲的是值在堆內存中的地址。
當使用賦值操作符=將一個引用類型變數賦值給另一個變數時,即使兩個變數的指向同一個對象,但是它們在內存中的地址是不同的,各自存儲了值在堆內存中的地址。
在這樣的語境下,深拷貝指的是創建一個新的對象,這個對象的屬性值在指向相同的地址外,與原先的對象沒有任何關聯。這就要求我們對對象進行完整的複製。
二、實現方法
實現深拷貝的方法有很多,這裡介紹其中兩種比較常用的方法。
三、使用JSON實現深拷貝(該方法不適用於拷貝含有function的對象)
function deepClone1(obj){ var _obj = JSON.parse(JSON.stringify(obj)); return _obj; }
該方法利用了JSON對象的parse和stringify方法,先將對象轉化為字元串,再將字元串轉化為對象,達到了對對象的拷貝目的。注意該方法可以拷貝的對象類型受限,無法拷貝含有function的對象。
四、使用遞歸實現深拷貝
function deepClone2(obj){ if(!obj || typeof obj !== 'object'){ return obj; } var newObj = obj.constructor === Array ? [] : {}; for(var key in obj){ if(obj.hasOwnProperty(key)){ newObj[key] = typeof obj[key] === 'object' ? deepClone2(obj[key]) : obj[key]; } } return newObj; }
該方法是利用遞歸實現的,根據對象的類型進行分支處理,如果是數組,則創建一個新的數組並循環拷貝每一項,否則創建一個空對象並循環拷貝每一個屬性。
其中需要注意的是,要使用 obj.hasOwnProperty(key) 來判斷屬性是否為對象自身的屬性,以免為對象添加了原型鏈上的屬性。
五、深拷貝實用場景舉例
深拷貝常用於以下場景:
- 當我們需要拷貝一個對象,但不想影響原對象時,可以使用深拷貝。
- 當我們需要對對象進行深度遍歷,以便對對象中的所有屬性進行操作時,也會使用深拷貝。
六、總結
深拷貝是JavaScript中一項非常重要的技術,本文介紹了基本概念、實現方法、實用場景等相關知識,並提供了兩種實現深拷貝的代碼示例。希望能夠對讀者在開發項目時選擇和使用適合的深拷貝方法提供一些幫助。
原創文章,作者:TMSBV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369990.html