Object.assign用法和常見的深拷貝方法

Object.assign() 方法用于將所有可枚舉屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象。它將返回目標(biāo)對(duì)象碳锈。

  • 如果目標(biāo)對(duì)象中的屬性具有相同的鍵,則屬性將被源對(duì)象中的屬性覆蓋。后面的源對(duì)象的屬性將類似地覆蓋前面的源對(duì)象的屬性滥嘴。

  • Object.assign 方法只會(huì)拷貝源對(duì)象自身的并且可枚舉的屬性到目標(biāo)對(duì)象。該方法使用源對(duì)象的[[Get]]和目標(biāo)對(duì)象的[[Set]]职祷,所以它會(huì)調(diào)用相關(guān) getter 和 setter氏涩。因此,它分配屬性有梆,而不僅僅是復(fù)制或定義新的屬性是尖。如果合并源包含getter,這可能使其不適合將新屬性合并到原型中泥耀。為了將屬性定義(包括其可枚舉性)復(fù)制到原型饺汹,應(yīng)使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。

  • String類型和 Symbol 類型的屬性都會(huì)被拷貝痰催。

  • 在出現(xiàn)錯(cuò)誤的情況下兜辞,例如,如果屬性不可寫夸溶,會(huì)引發(fā)TypeError逸吵,如果在引發(fā)錯(cuò)誤之前添加了任何屬性,則可以更改target對(duì)象缝裁。

  • Object.assign 不會(huì)在那些source對(duì)象值為 null或 undefined 的時(shí)候拋出錯(cuò)誤扫皱。

  • 針對(duì)深拷貝,需要使用其他辦法,因?yàn)?Object.assign()拷貝的是屬性值韩脑。假如源對(duì)象的屬性值是一個(gè)對(duì)象的引用氢妈,那么它也只指向那個(gè)引用。也就是說段多,如果對(duì)象的屬性值為簡(jiǎn)單類型(如string首量, number),通過Object.assign({},srcObj);得到的新對(duì)象為深拷貝进苍;如果屬性值為對(duì)象或其它引用類型加缘,那對(duì)于這個(gè)對(duì)象而言其實(shí)是淺拷貝的。

深拷貝的幾種實(shí)現(xiàn)方法

JSON.stringify 和 JSON.parse

用 JSON.stringify 把對(duì)象轉(zhuǎn)換成字符串琅捏,再用 JSON.parse 把字符串轉(zhuǎn)換成新的對(duì)象生百。
可以轉(zhuǎn)成 JSON 格式的對(duì)象才能使用這種方法,如果對(duì)象中包含 function 或 RegExp 這些就不能用這種方法了柄延。

//通過js的內(nèi)置對(duì)象JSON來進(jìn)行數(shù)組對(duì)象的深拷貝
function deepClone(obj) {
  let _obj = JSON.stringify(obj);
  let objClone = JSON.parse(_obj);
  return objClone;
}

Object.assign()拷貝

當(dāng)對(duì)象中只有一級(jí)屬性蚀浆,沒有二級(jí)屬性的時(shí)候,此方法為深拷貝搜吧,但是對(duì)象中有對(duì)象的時(shí)候市俊,此方法,在二級(jí)屬性以后就是淺拷貝滤奈。

通過jQuery的extend方法實(shí)現(xiàn)深拷貝

let $ = require('jquery');
let obj1 = {
   a: 1,
   b: {
     f: {
       g: 1
     }
   },
   c: [1, 2, 3]
};
let obj2 = $.extend(true, {}, obj1);

lodash.cloneDeep()實(shí)現(xiàn)深拷貝

let _ = require('lodash');
let obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
let obj2 = _.cloneDeep(obj1);

使用遞歸的方式實(shí)現(xiàn)深拷貝

function _deepClone(source) {
  let target;
  if (typeof source === 'object') {
    target = Array.isArray(source) ? [] : {}
    for (let key in source) {
      if (source.hasOwnProperty(key)) {
        if (typeof source[key] !== 'object') {
          target[key] = source[key]
        } else {
          target[key] = _deepClone(source[key])
        }
      }
    }
  } else {
    target = source
  }
  return target
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摆昧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜒程,更是在濱河造成了極大的恐慌绅你,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭躺,死亡現(xiàn)場(chǎng)離奇詭異忌锯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)领炫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門偶垮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帝洪,你說我怎么就攤上這事似舵。” “怎么了葱峡?”我有些...
    開封第一講書人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵砚哗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我砰奕,道長(zhǎng)频祝,這世上最難降的妖魔是什么泌参? 我笑而不...
    開封第一講書人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任脆淹,我火速辦了婚禮常空,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盖溺。我一直安慰自己漓糙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開白布烘嘱。 她就那樣靜靜地躺著昆禽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝇庭。 梳的紋絲不亂的頭發(fā)上醉鳖,一...
    開封第一講書人閱讀 49,874評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音哮内,去河邊找鬼盗棵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛北发,可吹牛的內(nèi)容都是我干的纹因。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼琳拨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瞭恰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狱庇,我...
    開封第一講書人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤惊畏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后密任,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颜启,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年批什,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了农曲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驻债,死狀恐怖乳规,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情合呐,我是刑警寧澤暮的,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站淌实,受9級(jí)特大地震影響冻辩,放射性物質(zhì)發(fā)生泄漏猖腕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一恨闪、第九天 我趴在偏房一處隱蔽的房頂上張望倘感。 院中可真熱鬧,春花似錦咙咽、人聲如沸老玛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜡豹。三九已至,卻和暖如春溉苛,著一層夾襖步出監(jiān)牢的瞬間镜廉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工愚战, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娇唯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓凤巨,卻偏偏與公主長(zhǎng)得像视乐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敢茁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容