2025年1月6日 星期一

JavaScript 深拷貝與淺拷貝

深拷貝與淺拷貝確實很常使用,這邊稍微紀錄一下,其中深拷貝的效果不是使用常見的

JSON.parse(JSON.stringify(object)) 來實作,這部分未來再深入探討...



現在淺拷貝大都使用「解構 」的方式



即使是陣列也是一樣


另外,陣列也可以使用 slice() 方法



再來聊聊深拷貝的部分,為何會有深淺之分呢?那是因為淺拷貝預設只會複製第一層的

屬性值給要指定的變數上,若其中複製的來源身上有某個屬性是物件或是陣列,淺拷貝

僅會將「reference (參考)」指到新的變數上,而沒有逐一將值複製出來


由上一個物件的淺拷貝來觀察


確實 person 與 person2 的內容值,看似一樣,但是若再仔細比較 family 屬性,兩者的

reference 其實是一樣的,顯示為 true


若此時調整 person.family 的內容,是否 person2 family 內容也會跟著調整?

由以下結果可以看出,person2 的 age 屬性沒有變動,person2 的 family.dad 變動了



有了以上的結論,我們希望完全的複製屬性值,內容不是參考同一個記憶體位置

可以使用 structuredClone 方法


以下舉例,透過深拷貝並且指定給 person3 變數,,並且觀察 person3 的內容


其中,物件的深拷貝有時我們會使用 JSON.parse(JSON.stringify(object)),差別只在於

若物件內容有 get 或 set 時,就會被轉為 {} ,不甚理想,這部分未來再深入探討



同樣的方式陣列也支援,只是陣列很少要深拷貝的情境





參考

沒有留言:

張貼留言