亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于遞歸復制對象代碼的疑問

關于遞歸復制對象代碼的疑問

慕田峪9158850 2018-11-21 15:23:51
// 使用遞歸來實現一個深度克隆,可以復制一個目標對象,返回一個完整拷貝var deepClone = function fnDeepClone(obj){    var result = typeof obj.splice === 'function'?[]:{},//如果這句注釋掉,會拋出異常,這句發揮的是什么作用?    key;    if (obj && typeof obj === 'object'){//這句怎么理解?如果obj是對象,typeof obj一定是對象啊。        for (key in obj ){            if (obj[key] && typeof obj[key] === 'object'){                result[key] = fnDeepClone(obj[key]);            }else{                result[key] = obj[key];//這句怎么理解?復制的不是值,而是鍵值對?            }         }        return result;    }    return obj;}var arr=[2,3,[6,7]];var brr=deepClone(arr);console.log(brr);
查看完整描述

1 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

  1. 判斷當前obj是對象還是數組,如果是數組,則 result 也是數組,否則 result 是普通對象

  2. 你的理解錯了,這句的意思是如果 obj 存在,并且是對象

  3. 如果不是引用類型(對象),則說明當前鍵的值是基礎類型,則直接將對應新的 result 對應的 key 也設置為這個值就可以了

by the way. 因為深拷貝一個對象有可能會造成內存泄漏問題。因為 key 有可能引用一個類型,從而在內部引用自身造成內存泄漏,所以深拷貝在遇到引用類型的 key 時會僅僅把 heap 內存的地址進行復制。

而且題目中第一行通過判斷 splice 來判斷是數組還是對象是不嚴謹的,萬一對象下有個叫 splice 的屬性剛好是函數呢,Array.isArray 方法的支持度很好,可以換成這個。

ES6的話直接 Object.assign() 就好


查看完整回答
反對 回復 2018-12-11
  • 1 回答
  • 0 關注
  • 427 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號