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"}

因此若是對象值中有這哥仨的話就要採用別的方法了,好比本身寫個函數什麼的搞定,好比這樣。spa

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()這些,這些只深複製了基本類型數據類型,不是真正意義的深複製,固然,若是要複製的對象或者數組都是簡單數據類型,那就大膽用吧。code

所謂方法,沒有最優,只有最合適的,因此選擇最合適的就ok啦。對象

相關文章
相關標籤/搜索