R.merge 与使用 rest 运算符组合之间有什么不同吗?

Is there anything different between R.merge vs composing with rest operator?

使用 R.merge 与使用 rest 运算符组合有什么优势吗?

const a = {name: 'john', job: 'developer'};
const b = {name: 'peter', commute: 'bike', address: {city: 'San Francisco'}};
const c = {...a, ...b};
console.log('rest', c);
const d = R.merge(a, b);
console.log('R.merge', d);

c 和 d 看起来是一样的。

是否存在 rest 运算符不起作用而 R.merge 起作用的情况?

R.merge 的当前实现实际上是 R.curry((l, r) => Object.assign({}, l, r))(尽管在必要时进行了 polyfill),因此当完全应用时,它的行为与示例中的其余运算符相同。

主要区别在于 R.merge 是柯里化的,允许部分应用。在 rest 运算符(或 Object.assign)不可用的环境中操作时,它也很有用。

因此,如果您不需要部分应用程序并且本身就可以使用 rest 运算符,那么使用 R.merge(a, b){...a, ...b} 没有什么好处。

除了 Scott Christopher 的(绝对正确且相关的)答案外,两者还有另一种不同之处。 merge 是一个 函数 {...a, ...b} 是一个 表达式 .

Javascript 的一个重要特征是函数首先是 class 公民:您可以将它们传递给函数,也可以从函数中 return 传递它们。它们可以是变量的值,也可以是对象的属性。表达式则不同。所以要有一个真正的等价,它将是

之间的一个
merge

(a, b) => ({...a, ...b})

即使这样也没有捕捉到 Scott 讨论的 R.merge 的柯里化性质。

当然,这对于一次性表达式没有影响,但是当您传递函数时,merge 可能更易读。