項目中使用深拷貝

深拷貝:完整的把數(shù)據(jù)的任意層級屬性和值拷貝到新數(shù)據(jù)上,拷貝前后的兩個數(shù)據(jù)完全一樣,但是是不同的地址,相互不會影響。

1.

    /** 返回克隆后的對象 */
    MixinClone(obj) {
      return JSON.parse(JSON.stringify(obj))
    },

2.

    let arr = {
        name: 'zhangsan',
        age: 18,
        family: {
            mather: 'mary',
            father: 'tom',
            brother: 'ah'
        }
    }
    // 判斷是否是對象或者數(shù)組(返回的是布爾值)
    function isObject(data) {
        return Object.prototype.toString.call(data) === '[object Array]' || Object.prototype.toString.call(data) === '[object Object]'
    }
    function objectDeepClone(data) {
        // 1.判斷data 是否是數(shù)組/對象
        if (!this.isObject(data)) {
            return data
        }
        // 2. 遞歸
        const obj = Array.isArray(data)? [] : {}
        for (const x in data) {
            if (this.isObject(data[x])) {
                obj[x] = objectDeepClone(data[x])
            } else {
                obj[x] = data[x]
            }
        }
        return obj
    }
    objectDeepClone(arr)
    console.log(objectDeepClone(arr), 'console數(shù)據(jù)============')
image.png

3.優(yōu)化后(堆棧溢出,原因便是會一直執(zhí)行遞歸,我們克隆的時候需要考慮該對象是否已被克隆,如果克隆過便記錄下來。)

    /**
     * 判斷是不是數(shù)組和對象
     * @param {*} data 要判斷的數(shù)據(jù)
     * @returns true 是 | false 否
     */
    MixinIsObject(data) {
      return Object.prototype.toString.call(data) === '[object Array]' || Object.prototype.toString.call(data) === '[object Object]'
    },
    /**
     * 深拷貝函數(shù)
     * @param {*} data 待拷貝的數(shù)據(jù)
     * @param {*} hash 利用Map數(shù)據(jù)結(jié)構(gòu)來解決循環(huán)引用造成死循環(huán)的問題
     * @returns 深拷貝后的數(shù)據(jù)
     */
    MixinDeepClone(data, hash = new Map()) {
      // 1. 判斷類型,只適用于array和object
      if (!this.MixinIsObject(data)) {
        return data
      }
      // 2. 如果已經(jīng)被克隆過了, 就直接return
      // map.has(key) —— 如果 key 存在則返回 true,否則返回 false
      if (hash.has(data)) {
        return hash.get(data)
      }
      const obj = Array.isArray(data) ? [] : {}
      // 3. 如果不存在, 將data存入到map中進(jìn)行克隆
      // 鍵值對的存儲, 是因為步驟2要判斷key
      hash.set(data, obj)
      for (const k in data) {
        if (this.MixinIsObject(data[k])) {
          obj[k] = this.MixinDeepClone(data[k], hash)
        } else {
          obj[k] = data[k]
        }
      }
      return obj
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 淺拷貝:只拷貝一層基本類型數(shù)據(jù),遇見引用類型還是復(fù)制的地址,所以拷貝后的數(shù)據(jù) 和 拷貝前的數(shù)據(jù),還存在共用同一個地...
    李小白呀閱讀 205評論 0 0
  • 淺拷貝:只拷貝一層基本類型數(shù)據(jù),遇見引用類型還是復(fù)制的地址,所以拷貝后的數(shù)據(jù) 和 拷貝前的數(shù)據(jù),還存在共用同一個地...
    紅_e8d9閱讀 95評論 0 0
  • javascript中的深拷貝和淺拷貝區(qū)分以及實現(xiàn)[http://caibaojian.com/javascrip...
    是青水啊閱讀 270評論 0 1
  • 1、javaScript的變量類型 (1)基本類型:5種基本數(shù)據(jù)類型Undefined、Null、Boolean、...
    wengjq閱讀 869評論 0 15
  • 鏈接本文主要講一下 js 的基本數(shù)據(jù)類型以及一些堆和棧的知識和什么是深拷貝、什么是淺拷貝、深拷貝與淺拷貝的區(qū)別,以...
    ZombieBrandg閱讀 881評論 0 1

友情鏈接更多精彩內(nèi)容