_.assign / _.extend (alias) = **shallow merge**: copy property value as-is. Nested object **không merge đệ quy** — object source ghi đè object target.
_.merge = **deep merge**: đệ quy merge nested object property.
Ví dụ
const _ = require('lodash');
let destination = { a: { b: 1, c: 2 } };
let source = { a: { d: 2, c: 3 } };
console.log(_.merge(destination, source));
// { a: { b: 1, c: 3, d: 2 } } — deep merge: b giữ, c ghi đè, d thêm
console.log(_.extend(destination, source));
// { a: { d: 2, c: 3 } } — shallow: a bị replace hoàn toàn
Khi nào dùng cái nào?
assign/extend: Config flat, override toàn bộ object con.merge: Config nested, muốn merge deep (ví dụ: default config + user config).
Lưu ý: Cả 2 đều **mutate destination object**. Muốn immutable: _.merge({}, dest, src) hoặc {...dest, ...src} (shallow).