首頁 > web前端 > js教程 > 主體

JS中深拷貝和淺拷貝差別?

Guanhui
發布: 2020-06-12 14:47:10
原創
5334 人瀏覽過

JS中深拷貝和淺拷貝差別?

JS中深拷貝和淺拷貝差異?

兩者的區別在於是否是真正獲取了一個對象的複製實體,而不是引用,深拷貝在計算機中開闢了一塊內存地址用於存放複製的對象,而淺拷貝僅僅是指向被拷貝的記憶體位址,如果原始位址中物件被改變了,那麼淺拷貝出來的物件也會隨之改變。

深拷貝

 最簡單的方法就是

JSON.parse(JSON.stringify())
function deepCopy(o) {
    return JSON.parse(JSON.stringify(o))
}
var c = {
    age: 1,
    name: undefined,
    sex: null,
    tel: /^1[34578]\d{9}$/,
    say: () => {
        console.log('hahha')
    }
}
// { age: 1, sex: null, tel: {} }
登入後複製

#要注意的是:這個拷貝方法不可以拷貝一些特殊的屬性(例如正規表示式,undefine,function)

用遞歸去複製所有層級屬性

function deepCopyTwo(obj) {
    let objClone = Array.isArray(obj) ? [] : {};
    if (obj && typeof obj == 'object') {
        for (const key in obj) {
            //判断obj子元素是否为对象,如果是,递归复制
            if (obj[key] && typeof obj[key] === "object") {
                objClone[key] = deepCopyTwo(obj[key]);
            } else {
                //如果不是,简单复制
                objClone[key] = obj[key];
            }
        }
    }
    return objClone;
}
登入後複製

淺拷貝

object.assign(target,source)
登入後複製

Object .assign 方法只複製來源物件中可列舉的屬性和物件本身的屬性

如果目標物件中的屬性具有相同的鍵,則屬性將被來源中的屬性覆寫。後來的來源的屬性將類似地覆寫早先的屬性

Object.assign 會跳過那些值為[null] null 是一個JavaScript 字面量,表示空值(null or an "empty" value),即沒有物件被呈現(no object value is present)。它是 JavaScript 原始值 之一。 ") 或 undefined 的來源物件。

推薦教學:《JS教學



##########################################################################

以上是JS中深拷貝和淺拷貝差別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
js
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!