---
# System prepended metadata

title: 淺拷貝 與 深拷貝

---

# 關於物件
物件是以傳參考的形式賦值，指向同一個空間，因此不論是以不同的變數命名，或是以函式方式建立，皆會修改物件的值(包含原始資料)。

要解決此問題，可使用淺拷貝與深拷貝方式建立新的物件。

# 淺拷貝
有以下兩個方法：
1. 建立變數並使用**Object.assign**建立新空間並傳進物件
    ```
    const something = {
        name: 'apple',
        obj: {}
    }
    const something2 = Object.assign({}, something)
    ```
    此時something與something2為不同物件，建立在不同空間
2. **使用...展開**
    ```
    const something = {
        name: 'apple',
        obj: {}
    }
    const something2 = {...something}
    ```
    此時something與something2為不同物件，建立在不同空間

淺拷貝優點為程式碼簡潔，但淺拷貝**只會拷貝第一層的屬性**，如果裡面有第二層物件的話，還是會是參考，此時就必須使用深拷貝。
    
# 深拷貝
**語法**
`JSON.parse(JSON.stringify(物件名稱))`
先使用JSON.stringify將物件轉為純文字
再使用JSON.parse將純文字轉回物件

此時不管該物件有幾層，都會是不同的空間。
