<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [toc] #### 1.淺拷貝 淺拷貝:拷貝的是對象的指針,修改內容互相影響 深拷貝:整個對象拷貝到另一個內存中,修改內容互不影響 #### 2.深拷貝 方法1:JSON.parse(JSON.stringify) 缺點:以下幾種value無法正常拷貝: undefined, NaN, function , Date對象,正則,以及循環引用等 ```js let a = { key1: NaN, // null key2: undefined, // 無 key3: function() { // 無 }, key4: new Date('2020-01-01'), // 轉化成時間string key5: new RegExp('\\w+'), // 空對象{} key6: new Error('err') // 空對象 {} } let b = JSON.parse(JSON.stringify(a)) ``` 方法2:手寫一個深拷貝 1.基礎遞歸版 ```js // 基礎遞歸版 function clone (target) { if (typeof target === 'object') { let cloneTarget = {} for (let key in target) { cloneTarget[key] = clone(target[key]) } return cloneTarget } else { return target } } ``` 2.考慮數組版(常用版) ``` 1.判斷是否是引用類型: 如果不是,則直接 return 2.判斷是對象還是,數組 3.用 for in 遍歷每一個 key,并將 target 的value賦值給 新的 value 4.賦值value的時候,注意可能value也是一個引用類型,所以需要自調用clone方法,形成遞歸 5.for in 結束時遞歸結束 ``` ```js function clone(target) { // 判斷是否為引用類型 if (typeof target === 'object') { // 判斷是否為數組 let cloneTarget = Array.isArray(target) ? [] : {} for (let key in target) { // 遞歸 cloneTarget[key] = clone(target[key]) } return cloneTarget } else { return target } } ``` 3.解決循環引用的問題: 遍歷如下對象,會陷入無線遞歸 ```js let obj = { a: 1, b: { a: 123, b: { c: 456, }, d: [1, 2, 3, [4, 5]], }, }; obj[obj] = obj; ``` 解決辦法: 1.添加一個map,記錄map上是否有target對象,如果有直接return,避免陷入無線遞歸 2.如果沒有則,map.set(target, cloneTarget),然后再遍歷遞歸key上的值 ```js function clone(target, map = new Map()) { // 判斷是否為引用類型 if (typeof target === 'object') { // 判斷是否為數組 let res = Array.isArray(target) ? [] : {} if (map.has(target)) { return map.get(target) } else { map.set(target, res) } for (let i in target) { res[i] = clone(target[i], map) } return res } else { return target } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看