js的深拷貝的理解和實現
阿新 • • 發佈:2019-02-18
typeof 子元素 str cti ole 拷貝 忽略 tin for
一:什麽是深拷貝?
舉例:a=b,當改變a時b也改變這樣的copy就是淺拷貝,反之當改變a時b不會改變就是深拷貝
二:實現深拷貝
1、最簡單方法就是使用JSON.stringfy()和JSON.parse()。
var syb = Symbol(‘obj‘); var person = { name :‘tino‘, say: function(){ console.log(‘hi‘); }, ok: syb, un: undefined } var copyPerson = JSON.parse(JSON.stringify(person))
但是有局限性:當值為undefined
、function
、symbol
會在轉換過程中被忽略,對象值有這三種的話用這種方法會導致屬性丟失。
2、通用方法(遞歸復制)
deepClone => (obj){ let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(key in obj){ if(obj.hasOwnProperty(key)){ //判斷ojb子元素是否為對象,如果是,遞歸復制 if(obj[key]&&typeof obj[key] ==="object"){ objClone[key] = deepClone(obj[key]); }else{ //如果不是,簡單復制 objClone[key] = obj[key]; } } } } return objClone; }
js的深拷貝的理解和實現