js對象的深拷貝


關於對象的深拷貝一直是大家津津樂道一個話題,本騷年通過研究(yuedu)發現還是很easy的。

首推的方法簡單有效,JSON.stringfy()和JSON.parse()即可搞定。但是這種簡單粗暴的方法有其局限性。當值為undefinedfunctionsymbol 會在轉換過程中被忽略。。。所以,對象值有這三種的話用這種方法會導致屬性丟失。

var syb = Symbol('obj');
var person = {
   name :'tino',
   say: function(){
      console.log('hi');
   },
   ok: syb,
   un: undefined
}
var copy = JSON.parse(JSON.stringify(person))
// copy
// {name: "tino"}

所以如果對象值中有這哥仨的話就要采用別的方法了,比如自己寫個函數什么的搞定,比如這樣。

function deepCopy(obj) {
      var result = Array.isArray(obj) ? [] : {};
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === 'object' && obj[key]!==null) {
            result[key] = deepCopy(obj[key]);   //遞歸復制
          } else {
            result[key] = obj[key];
          }
        }
      }
      return result;
    }

還有一些Object.assgin(), 數組的slice()這些,這些只深復制了基本類型數據類型,不是真正意義的深復制,當然,如果要復制的對象或者數組都是簡單數據類型,那就大膽用吧。

所謂方法,沒有最優,只有最合適的,所以選擇最合適的就ok啦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM