Lodash-.extend()/ .assign()和.merge()之间的区别

在Lodash库中,有人可以更好地解释合并和扩展/分配。


这是一个简单的问题,但答案仍然使我回避。


千万里不及你
浏览 779回答 3
3回答

函数式编程

Lodash版本3.10.1方法比较_.merge(object, [sources], [customizer], [thisArg])_.assign(object, [sources], [customizer], [thisArg])_.extend(object, [sources], [customizer], [thisArg])_.defaults(object, [sources])_.defaultsDeep(object, [sources])相似点正如您所料,它们都不对数组起作用_.extend是的别名_.assign,因此它们是相同的它们似乎都在修改目标对象(第一个参数)他们都null一样差异性_.defaults并_.defaultsDeep以相反的顺序处理参数(尽管第一个参数仍然是目标对象)_.merge并且_.defaultsDeep将合并子对象和其他人将在根级别覆盖仅_.assign并且_.extend将用覆盖值undefined测验他们都以类似的方式从根本上处理成员。_.assign      ({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }_.merge       ({}, { a: 'a' }, { a: 'bb' }) // => { a: "bb" }_.defaults    ({}, { a: 'a' }, { a: 'bb' }) // => { a: "a"  }_.defaultsDeep({}, { a: 'a' }, { a: 'bb' }) // => { a: "a"  }_.assign处理,undefined但其他人会跳过它_.assign      ({}, { a: 'a'  }, { a: undefined }) // => { a: undefined }_.merge       ({}, { a: 'a'  }, { a: undefined }) // => { a: "a" }_.defaults    ({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }_.defaultsDeep({}, { a: undefined }, { a: 'bb' }) // => { a: "bb" }他们都处理null相同_.assign      ({}, { a: 'a'  }, { a: null }) // => { a: null }_.merge       ({}, { a: 'a'  }, { a: null }) // => { a: null }_.defaults    ({}, { a: null }, { a: 'bb' }) // => { a: null }_.defaultsDeep({}, { a: null }, { a: 'bb' }) // => { a: null }但只有_.merge并且_.defaultsDeep会合并子对象_.assign      ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "b": "bb" }}_.merge       ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}_.defaults    ({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a" }}_.defaultsDeep({}, {a:{a:'a'}}, {a:{b:'bb'}}) // => { "a": { "a": "a", "b": "bb" }}而且它们似乎都不会合并数组_.assign      ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }_.merge       ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "bb" ] }_.defaults    ({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a"  ] }_.defaultsDeep({}, {a:['a']}, {a:['bb']}) // => { "a": [ "a"  ] }全部修改目标对象a={a:'a'}; _.assign      (a, {b:'bb'}); // a => { a: "a", b: "bb" }a={a:'a'}; _.merge       (a, {b:'bb'}); // a => { a: "a", b: "bb" }a={a:'a'}; _.defaults    (a, {b:'bb'}); // a => { a: "a", b: "bb" }a={a:'a'}; _.defaultsDeep(a, {b:'bb'}); // a => { a: "a", b: "bb" }没有一个能真正按预期工作注意:正如@Mistic所指出的,Lodash将数组视为对象,其中键是数组的索引。_.assign      ([], ['a'], ['bb']) // => [ "bb" ]_.merge       ([], ['a'], ['bb']) // => [ "bb" ]_.defaults    ([], ['a'], ['bb']) // => [ "a"  ]_.defaultsDeep([], ['a'], ['bb']) // => [ "a"  ]_.assign      ([], ['a','b'], ['bb']) // => [ "bb", "b" ]_.merge       ([], ['a','b'], ['bb']) // => [ "bb", "b" ]_.defaults    ([], ['a','b'], ['bb']) // => [ "a", "b"  ]_.defaultsDeep([], ['a','b'], ['bb']) // => [ "a", "b"  ]

慕田峪7331174

要注意的另一个区别是undefined值的处理:mergeInto = { a: 1}toMerge = {a : undefined, b:undefined}lodash.extend({}, mergeInto, toMerge) // => {a: undefined, b:undefined}lodash.merge({}, mergeInto, toMerge)  // => {a: 1, b:undefined}因此merge不会将undefined值合并为定义的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript