函数式编程
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" ]