Object.assign

assign

object.assign 項目中和數(shù)據(jù)復制以及賦值有關(guān)的操作,都可涉及到
Object.assign(target, ...source)

// 語法
  Object.assign(target, ...source)
  
// 其中target 是目標對象,sources 是源對象安吁,可以有多個护糖,返回修改后的目標對象 target侦副。
  const target = { a: 1 };
  const source1 = { b: 2 };
  const source2 = { c: 3 };

  Object.assign(target, source1, source2); //  target {a:1, b:2, c:3}
  • 如果目標對象與源對象有同名屬性竹挡,或多個源對象有同名屬性趾疚,則后面的屬性會覆蓋前面的屬性
  const target = { a: 1, b: 1 };
  const source1 = { b: 2, c: 4 };
  const source2 = { a: 5, c: 3 }
  Object.assign(target, source1, source2); // target  {a:5, b:2, c:3}
  • 如果只有一個參數(shù)没咙,Object.assign會直接返回該參數(shù)猩谊。
  const obj = {a: 1};
  Object.assign(obj) === obj // true
  • 如果該參數(shù)不是對象,則會先轉(zhuǎn)成對象祭刚,然后返回
  Object.assign(2) // Number: {2}
  typeof Object.assign(2) // "object"
  • undefined和null無法轉(zhuǎn)成對象牌捷,所以如果它們作為參數(shù),會報錯, 位置很重要涡驮,看下一條
  Object.assign(undefined) // 報錯  Cannot convert undefined or null to object
  Object.assign(null) // 報錯  Cannot convert undefined or null to object
  • 如果非對象參數(shù)出現(xiàn)在源對象的位置(即非首參數(shù))暗甥,那么處理規(guī)則有所不同。首先捉捅,這些參數(shù)都會轉(zhuǎn)成對象撤防,如果無法轉(zhuǎn)成對象,就會跳過棒口。這意味著寄月,如果undefined和null不在首參數(shù),就不會報錯无牵。
  let obj = {a: 1};
  Object.assign(obj, undefined)     // { a: 1 }
  Object.assign(obj, undefined) === obj // true  
  Object.assign(obj, null) === obj // true  
  • 其他類型的值(即數(shù)值漾肮、字符串和布爾值)不在首參數(shù),也不會報錯合敦。但是初橘,除了字符串會以數(shù)組形式,拷貝入目標對象,其他值都不會產(chǎn)生效果保檐。
  const v1 = 'abc';
  const v2 = true;
  const v3 = 10;
  const obj = Object.assign({}, v1, v2, v3);  //  { "0": "a", "1": "b", "2": "c" }
  const obj2 = Object.assign({}, v2, v3)  //  {  }
  上面代碼中耕蝉,v1、v2夜只、v3分別是字符串垒在、布爾值和數(shù)值,結(jié)果只有字符串合入目標對象(以字符數(shù)組的形式),
  數(shù)值和布爾值都會被忽略扔亥。這是因為只有字符串的包裝對象场躯,會產(chǎn)生可枚舉屬性
  Object(true)  // {[[PrimitiveValue]]: true}
  Object(10)    //  {[[PrimitiveValue]]: 10}
  Object('abc') // {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}

  • Object.assign拷貝的屬性是有限制的,只拷貝源對象的自身屬性(不拷貝繼承屬性)旅挤,也不拷貝不可枚舉的屬性(enumerable: false)踢关。
  Object.assign({b: 'c'},
      Object.defineProperty({}, 'invisible', {
        enumerable: false,
        value: 'hello'
     })
  )
  // { b: 'c' }

  // Object.defineProperty定義新屬性或修改原有的屬性。
  Object.defineProperty(obj, prop, descriptor)
  obj:必需粘茄。目標對象 
  prop:必需签舞。需定義或修改的屬性的名字
  descriptor:必需。目標屬性所擁有的特性

注意點

  • Object.assign方法實行的是淺拷貝柒瓣,而不是深拷貝儒搭。也就是說,如果源對象某個屬性的值是對象芙贫,那么目標對象拷貝得到的是這個對象的引用搂鲫。
  const obj1 = {a: {b: 1}};
  const obj2 = Object.assign({}, obj1);
  obj1.a.b = 2;
  obj2.a.b // 2
  • 同名屬性的替換
  const target = { a: { b: 'c', d: 'e' } }
  const source = { a: { b: 'hello' } }
  Object.assign(target, source)
  // { a: { b: 'hello' } }

一些函數(shù)庫提供 Object.assign的定制版本(比如 Lodash 的_.defaultsDeep方法),可以得到深拷貝的合并磺平。_.defaultsDeep

  • 數(shù)組的處理
    Object.assign可以用來處理數(shù)組魂仍,但是會把數(shù)組視為對象。
  Object.assign([1, 2, 3], [4, 5])
  // [4, 5, 3]   Object.assign把數(shù)組視為屬性名為 0褪秀、1蓄诽、2 的對象,因此源數(shù)組的 0 號屬性4覆蓋了目標數(shù)組的 0 號屬性1
  • 取值函數(shù)的處理
  const source = {
    get foo() { return 1 }
  };
  const target = {};

  Object.assign(target, source)
  // { foo: 1 }   source對象的foo屬性是一個取值函數(shù)媒吗,Object.assign不會復制這個取值函數(shù)仑氛,只會拿到值以后,將這個值復制過去闸英。

常見用途

  class Point {
    constructor(x, y) {
      Object.assign(this, {x, y});
    }
  }
  // 上面方法通過Object.assign方法锯岖,將x屬性和y屬性添加到Point類的對象實例。
  • 為對象添加方法
  Object.assign(SomeClass.prototype, {
    someMethod(arg1, arg2) {
      ···
    },
    anotherMethod() {
      ···
    }
  });

  // 等同于下面的寫法
  SomeClass.prototype.someMethod = function (arg1, arg2) {
   ···
  };
  SomeClass.prototype.anotherMethod = function () {
    ···
  };
  • 克隆對象
  function clone(origin) {
    let originProto = Object.getPrototypeOf(origin);
    return Object.assign(Object.create(originProto), origin);
  }
  // Object.getPrototypeOf() 方法返回指定對象的原型 ( 即, 內(nèi)部[[Prototype]]屬性)
  
  • 為屬性指定默認值
  const DEFAULTS = {
    logLevel: 0,
    outputFormat: 'html'
  };

  function processContent(options) {
    options = Object.assign({}, DEFAULTS, options);
    console.log(options);
    // ...
  }
// 用戶若不提供參數(shù)甫何,則使用默認的參數(shù)出吹,提供參數(shù)會覆蓋默認的參數(shù)


  const DEFAULTS = {
    url: {
      host: 'example.com',
      port: 7070
    },
  };

  processContent({ url: {port: 8000} })
  // {
  //   url: {port: 8000}
  // }
  // 上面代碼的原意是將 url.port改成 8000,url.host不變辙喂。實際結(jié)果卻是options.url覆蓋掉DEFAULTS.url捶牢,所以url.host就不存在了鸠珠。

和上面提到的同名替換相關(guān),對象的話秋麸,會直接覆蓋整個對象渐排,所以最好參數(shù)對應的值都是簡單類型,避免對象灸蟆。

推薦網(wǎng)站: 騰訊云

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驯耻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炒考,更是在濱河造成了極大的恐慌可缚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斋枢,死亡現(xiàn)場離奇詭異帘靡,居然都是意外死亡,警方通過查閱死者的電腦和手機杏慰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門测柠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缘滥,你說我怎么就攤上這事≮酥鳎” “怎么了朝扼?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霎肯。 經(jīng)常有香客問我擎颖,道長,這世上最難降的妖魔是什么观游? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任搂捧,我火速辦了婚禮,結(jié)果婚禮上懂缕,老公的妹妹穿的比我還像新娘允跑。我一直安慰自己,他們只是感情好搪柑,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布聋丝。 她就那樣靜靜地躺著,像睡著了一般工碾。 火紅的嫁衣襯著肌膚如雪弱睦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天渊额,我揣著相機與錄音况木,去河邊找鬼垒拢。 笑死,一個胖子當著我的面吹牛火惊,可吹牛的內(nèi)容都是我干的求类。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼矗晃,長吁一口氣:“原來是場噩夢啊……” “哼仑嗅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起张症,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤仓技,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俗他,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脖捻,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年兆衅,在試婚紗的時候發(fā)現(xiàn)自己被綠了地沮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡亩,死狀恐怖摩疑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畏铆,我是刑警寧澤雷袋,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站辞居,受9級特大地震影響楷怒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓦灶,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一鸠删、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贼陶,春花似錦刃泡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眨层,卻和暖如春庙楚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趴樱。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工馒闷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酪捡,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓纳账,卻偏偏與公主長得像逛薇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疏虫,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361