JS中深拷貝和淺拷貝的區別是什麼,需要具體程式碼範例
在JavaScript中,物件的拷貝分為淺拷貝和深拷貝兩種方式。淺拷貝僅複製物件的引用位址,而深拷貝則是建立一個完全獨立的副本。
淺拷貝是將原始物件的參考位址複製給新對象,它們指向同一塊記憶體空間。當修改其中任意一個物件的屬性時,另一個物件的對應屬性也會被修改。這是因為它們共享相同的記憶體位址。
深拷貝是建立一個全新的對象,並將原對像中的所有屬性逐一複製到新對像中,新對象和原始對象互不影響。即使修改其中一個物件的屬性,另一個物件的屬性也不會受到影響。
下面,我將透過具體的程式碼範例來說明淺拷貝和深拷貝的差異。
首先,我們來看一個淺拷貝的範例:
let obj1 = {name: "Alice", age: 20}; let obj2 = obj1; obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 21}
在上述程式碼中,我們透過將obj1
賦值給obj2
實現了一個淺拷貝。當修改obj1
的age
屬性時,obj2
的age
屬性也被修改了,這是因為它們指向同一塊記憶體位址。
接下來,我們來看一個深拷貝的範例:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } let clone = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } let obj1 = {name: "Alice", age: 20}; let obj2 = deepClone(obj1); obj1.age = 21; console.log(obj1); // {name: "Alice", age: 21} console.log(obj2); // {name: "Alice", age: 20}
在上述程式碼中,我們定義了一個deepClone
函數,用於實現深拷貝。函數首先判斷傳入的參數是否為null或不是物件類型,如果是則直接傳回,否則建立一個與傳入物件類型相同的空物件clone
。然後透過遍歷原物件的屬性,遞歸呼叫deepClone
函數對每個屬性進行深拷貝,並賦值給對應的clone
屬性。最後返回新物件clone
。
透過使用deepClone
函數,我們實作了對obj1
的深拷貝。即使修改了obj1
的age
屬性,但obj2
的age
屬性仍然保持不變,這是因為它們是兩個完全獨立的對象。
綜上所述,淺拷貝僅複製物件的引用位址,而深拷貝是建立一個完全獨立的副本。深拷貝能夠保證在修改副本對象時不影響原對象,適用於有嵌套結構的對象拷貝。需要注意的是,在實際開發中,深拷貝可能會導致效能開銷較大,因此需要根據實際情況選擇合適的拷貝方式。
以上是JS中深度複製和淺複製有何不同的詳細內容。更多資訊請關注PHP中文網其他相關文章!