lodash中extend,assign,merge的異同
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 函數會修改原來的對象!
merge(users, ages)
console.log(users) // { data: [ { user: 'barney', age: 36 }, { user: 'fred', age: 40 } ]
|
總結
相同之處
- 都可以用來合併對象
- 都會修改原來的對象 (如果原來的對象是作爲函數的第一個參數的話)
不同之處
-
assign
函數不會處理原型鏈上的屬性,也不會合並相同的屬性,而是用後面的屬性值覆蓋前面的屬性值 -
extend
- 3.x 版本中和
assign
一樣 - 4.x 版本中會合並原型鏈上的屬性
- 3.x 版本中和
-
merge
遇到相同屬性名的時候,如果屬性值是純對象或集合的時候,會合並屬性值 -