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

时间:2017-12-06 07:22:39

标签: ramda.js

使用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看起来是一样的。

有没有其他操作员在R.merge会不会工作的情况下?

2 个答案:

答案 0 :(得分:3)

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

主要区别在于R.merge是curry,允许部分应用。在其余运算符(或Object.assign)不可用的环境中运行时,它也很有用。

因此,如果您不需要部分申请并且其余操作员可以原生使用,那么使用R.merge(a, b)而不是{...a, ...b}几乎没有任何好处。

答案 1 :(得分:2)

除了斯科特克里斯托弗的(绝对正确和相关)答案之外,还有另外一种方式,两者不同。 merge功能{...a, ...b}表达式

Javascript的一个重要特性是函数是一等公民:您可以将它们传递给函数并从函数返回它们。它们可以是变量的值,也可以是对象的属性。表达式也是如此。所以要有一个真正的等价,它将是

之间的一个
merge

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

即便如此,也不能反映斯科特讨论的R.merge的俗气。

当然这对于一次性表达没有区别,但是当你传递函数时,merge可能会更清楚地阅读。