亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Lodash 中 assign,extend 和 merge 的區(qū)別

solocoder / 1171人閱讀

摘要:簡(jiǎn)介我們經(jīng)常在別人的代碼中看見(jiàn),,函數(shù),這三個(gè)函數(shù)用起來(lái)很相似,都是合并源對(duì)象的屬性到目標(biāo)對(duì)象中。會(huì)修改原來(lái)的對(duì)象在版本中,是的別名,它們的作用是一模一樣的。在版本中,是的別名,和有點(diǎn)區(qū)別。如果源對(duì)象的屬性值為,則會(huì)忽略該屬性。

簡(jiǎn)介

我們經(jīng)常在別人的代碼中看見(jiàn) assign,extendmerge 函數(shù),這三個(gè)函數(shù)用起來(lái)很相似,都是合并源對(duì)象的屬性到目標(biāo)對(duì)象中。

既然都是合并對(duì)象,為什么還分三個(gè)不同的函數(shù)呢?它們之間到底有什么區(qū)別呢?

assign(object, [sources])

我們先看看官方網(wǎng)站上面的定義:

Assigns own enumerable string keyed properties of source objects to the destination object. Source objects are applied from left to right. Subsequent sources overwrite property assignments of previous sources.

把源對(duì)象(sources)的屬性分配到目標(biāo)對(duì)象(object),源對(duì)象會(huì)從左往右地調(diào)用,后面對(duì)象的屬性會(huì)覆蓋前面的。

看看下面的例子:

assign({}, { a: 1 }, { b: 2 });
// { a: 1, b: 2 }

// 后面的 { a: 2 } 把前面的 { a: 1 } 覆蓋了
assign({}, { a: 1 }, { b: 2 }, { a: 2 });
// { a: 2, b: 2 }

// 觀察下面兩個(gè)例子,如果屬性值為 object,后面的值會(huì)覆蓋前面的值
assign(
  {},
  { a: 1 },
  { b: { c: 2, d: 3 } }
)
// { a: 1, b: { c: 2, d: 3 } }

assign(
  {},
  { a: 1 },
  { b: { c: 2, d: 3 } },
  { b: { e: 4 } }
)
// { a: 1, b: { e: 4 } }

// `assign` 函數(shù)會(huì)忽略原型鏈上的屬性。
function Foo() { this.c = 3; }
Foo.prototype.d = 4;
assign({ a: 1 }, new Foo());
// { a: 1, c: 3 }

// `assign` 會(huì)修改原來(lái)的對(duì)象
var test = { a: 1 };
assign(test, { b: 2 }); // { a: 1, b: 2 }
console.log(test);      // { a: 1, b: 2 }
extend(object, [sources])

在 3.x 版本中,extendassign 的別名,它們的作用是一模一樣的。
在 4.x 版本中,extendassignIn 的別名,和 assign 有點(diǎn)區(qū)別。

官方定義如下:

This method is like _.assign except that it iterates over own and inherited source properties.

在上面的例子中,我們知道 assign 函數(shù)不會(huì)把原型鏈上的屬性合并到目標(biāo)對(duì)象,而 extendassignIn 函數(shù)則會(huì)!

// Important !! this is Lodash 4.x !!

// 把源對(duì)象原型鏈上的屬性也合并到目標(biāo)對(duì)象上!
function Foo() { this.c = 3; }
Foo.prototype.d = 4;
extend({ a: 1 }, new Foo());
// { a: 1, c: 3, d: 4 }
merge(object, [sources])

我們看看 merge 函數(shù)的定義:

This method is like _.assign except that it recursively merges own and inherited enumerable string keyed properties of source objects into the destination object. Source properties that resolve to undefined are skipped if a destination value exists. Array and plain object properties are merged recursively.Other objects and value types are overridden by assignment. Source objects are applied from left to right. Subsequent sources overwrite property assignments of previous sources.

merge 也和 assign 類似,不同的地方在于 merge 遇到相同屬性的時(shí)候,如果屬性值為純對(duì)象(plain object)或者集合(collection)時(shí),不是用后面的屬性值去覆蓋前面的屬性值,而是會(huì)把前后兩個(gè)屬性值合并。
如果源對(duì)象的屬性值為 undefined,則會(huì)忽略該屬性。

assign(
  {},
  { a: 1 },
  { b: { c: 2, d: 3} },
  { b: { e: 4 } }
)
// { a: 1, b: { e: 4 } }
merge(
  {},
  { a: 1 },
  { b: { c: 2, d: 3} },
  { b: { e: 4 } }
)
// { a: 1, b: { c: 2, d: 3, e: 4 } }

// 合并集合
var users = {
  "data": [{ "user": "barney" }, { "user": "fred" }]
};
var ages = {
  "data": [{ "age": 36 }, { "age": 40 }]
};
merge({}, users, ages)
// { data: [ { user: "barney", age: 36 }, { user: "fred", age: 40 } ] }

// merge 函數(shù)會(huì)修改原來(lái)的對(duì)象!
merge(users, ages)
console.log(users) // { data: [ { user: "barney", age: 36 }, { user: "fred", age: 40 } ]
總結(jié) 相同之處

都可以用來(lái)合并對(duì)象

都會(huì)修改原來(lái)的對(duì)象 (如果原來(lái)的對(duì)象是作為函數(shù)的第一個(gè)參數(shù)的話)

不同之處

assign 函數(shù)不會(huì)處理原型鏈上的屬性,也不會(huì)合并相同的屬性,而是用后面的屬性值覆蓋前面的屬性值

extend

3.x 版本中和 assign 一樣

4.x 版本中會(huì)合并原型鏈上的屬性

merge 遇到相同屬性名的時(shí)候,如果屬性值是純對(duì)象或集合的時(shí)候,會(huì)合并屬性值

出處

http://scarletsky.github.io/2016/04/02/a...

參考資料

https://lodash.com/docs
http://stackoverflow.com/questions/19965...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/79107.html

相關(guān)文章

  • JavaScript復(fù)制(合并)對(duì)象

    摘要:實(shí)現(xiàn)合并對(duì)象的方法有很多種,比如也是用寫的,謝謝系列等,至于區(qū)別自己看文檔,文檔地址打造的一個(gè)不可變數(shù)據(jù)結(jié)構(gòu)庫(kù)的方法其中,為原生方法,但是存在以下兩個(gè)在具體應(yīng)用場(chǎng)景上的缺點(diǎn)瀏覽器兼容性問(wèn)題只能進(jìn)行淺合并關(guān)于淺合并深合并,碼友之述備矣,這里就 javascript實(shí)現(xiàn)合并對(duì)象的方法有很多種,比如: 1、Object.assign 2、jQuery.extend(jQuery也是用java...

    vslam 評(píng)論0 收藏0
  • 【騰訊Bugly干貨分享】React 移動(dòng) web 極致優(yōu)化

    摘要:數(shù)據(jù)管理及性能優(yōu)化統(tǒng)一管理數(shù)據(jù)這一部份算是重頭戲吧。重復(fù)渲染導(dǎo)致卡頓這套的東西在家校群頁(yè)面上用得很歡樂(lè),以至于不用怎么寫都沒(méi)遇到過(guò)什么性能問(wèn)題。但放到移動(dòng)端上,我們?cè)诹斜眄?yè)重構(gòu)的時(shí)候就馬上遇到卡頓的問(wèn)題了。列表頁(yè)目前的處理辦法是將值換成。 本文來(lái)自于騰訊bugly開發(fā)者社區(qū),非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載,原文地址:http://dev.qq.com/topic/57908... 最近一個(gè)季度...

    suosuopuo 評(píng)論0 收藏0
  • 關(guān)于API 選擇一些思考.

    摘要:?jiǎn)栴}描述我經(jīng)常需要使用一些基礎(chǔ)性的功能性函數(shù)比如數(shù)據(jù)去重對(duì)象合并等通常情況下選擇方向大致有個(gè)自己實(shí)現(xiàn)使用原生的使用提供的首先放棄自己實(shí)現(xiàn)這樣的方式因?yàn)楣ぷ髁看蠹词箤?shí)現(xiàn)了沒(méi)有經(jīng)過(guò)測(cè)試不夠穩(wěn)定沒(méi)有意義因?yàn)橐呀?jīng)存在現(xiàn)成的別人實(shí)現(xiàn)的其次如果原生提供 問(wèn)題描述:我經(jīng)常需要使用一些基礎(chǔ)性的, 功能性函數(shù), 比如數(shù)據(jù)去重, 對(duì)象合并等. 通常情況下,選擇方向大致有3個(gè): 自己實(shí)現(xiàn) API 使用原生...

    Tychio 評(píng)論0 收藏0
  • vue + typescript 進(jìn)階篇

    摘要:進(jìn)階篇本文是繼新項(xiàng)目起手式之后的進(jìn)階踩坑配置,所以推薦先行閱讀前文完整閱讀完之后,基本可以順利在新項(xiàng)目中使用了另外特別注意不推薦在已有項(xiàng)目上強(qiáng)加,因?qū)懛ǖ慕M件跟之前的組件不兼容,若上的話需要修改之前寫的組件配置完整版可參考,若沒(méi)配置出來(lái) vue + typescript 進(jìn)階篇 本文是繼 Vue + TypeScript 新項(xiàng)目起手式 之后的進(jìn)階+踩坑配置,所以推薦先行閱讀前文 ...

    lemanli 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<