函数扩展运算符
您不能正式做到这一点,但是您可以编写一个功能大致相同的函数。 让我们看看您应该怎么做,也许为什么。
但是首先,您是否遇到过这种情况?
const result = f(x)
if (result === undefined ) {
g(x)
}
当另一个函数针对同一输入返回未定义时,您想用输入调用一个函数。 上面的作品,但是如果我们更概括一些,那会不会很好?
如果我们使用对象,则可以使用散布运算符很好地完成。
const combinedObj = {...gObj, ...fObj}
that看起来不漂亮吗? 当我调用combinedObj[x]
,它将返回fObj[x]
除非undefined
为x
undefined
fObj
。 在这种情况下,将返回gObj[x]
。 但是真正的好处是我可以对任意数量的对象进行处理。
const combinedObj = {...gObj, ...fObj, ...hObj, ...iObj, ...jObj}
那么,我们如何可以定义可以同样波及其他功能如何的功能…
利差对象?
眼镜
好吧, spread
应该可以使用两个函数f
和g
const fObj = { a : 1 , b : 2 }
const gObj = { b : 3 , c : 4 }
const f = ( x ) => fObj[x]
const g = ( x ) => gObj[x]
spread(f, g)
并返回一个函数,该函数首先使用输入调用g
,并且仅当g
返回undefined
它才会调用f
。
const combined = spread(f, g)
[ 'a' , 'b' , 'c' ].map( i => combined(i)) // => [1, 3, 4]
我们可以这样定义两个函数传播。
const spread = ( f, g ) => g(x) !== undefined ? g(x) : f(x)
如果要扩展两个以上的函数,可以修改扩展以获取函数列表。
const spread = fns =>
fns.reduce( ( a, f ) => x => f(x) !== undefined ? f(x) : a(x))
spread([f, g, h, i, j])
为什么? 因为我们很懒...
嗯,就其本身而言,它只是遵循通用javascript概念(“传播”)的泛化。 如果您了解传播如何与对象一起使用,您将了解传播如何与功能一起使用。 比弄清楚我们开始时的if语句在做什么,花了更少的脑力。 这是我们使用map
和reduce
的相同原因。 有许多方法可以实现不使用map
并进行reduce
操作,而无需使用它们,但是乍一看,我们的代码就变得容易得多。
此外,传播使我们可以将对象包装在函数中,以实现懒惰求值的利益,而不会牺牲传播的能力。 换句话说,我们可以在需要输出时懒散地传播。
例如,假设我们想要一个对象的键的单个值,该对象是通过扩展两个其他对象而创建的。
const fObj = { a : 1 , b : 2 , c : 3 , d : 4 , e : 5 , f : 6 , g : 7 , h : 8 }
const gObj = { a : 100 , c : 99 , e : 88 , g : 777 }
const combined = {...fObj, ...gObj }
combined[ 'd' ]
然后,即使我们只需要单个键'd'
的值,我们也必须产生一个与所有新值组合的全新对象。 随着功能的扩展,我们可以避免创建新对象。
const f = x => fObj[x]
const g = x => gObj[x]
const combined = spread([f, g])
combined( 'd' )
由于实际建立的扩展是三元和函数的逻辑流,因此当我们要求单个键的值时,它执行逻辑以仅获取该键的值,而不必担心获取其他值。 甚至这个小例子似乎也显示出性能提升。 如果我们不得不传播更多的时间,我们可以为自己节省更多的中介对象和更多的时间。
最终,由于传播产生了一个函数,我们还获得了使用诸如函数组合之类的函数的所有好处! 这又是我们的价差定义:
const spread = ( ...fns ) =>
fns.reduce( ( a, f ) => x => {
const v = f(x)
return v !== undefined ? v : a(x)
})
spread(f, g, h, i, j)
此定义与我们之前看到的定义有两个细微的差异。 1. 如果返回值不是 undefined
则 这避免了 f(x)
的重新执行 。 2.我们正在扩展输入数组,这使最终用户可以调用 spread(f, g)
而无需将函数放入数组中。
试试看,让我知道您的想法! 😄
翻译自: https://hackernoon.com/how-to-use-the-spread-operator-on-a-function-and-why-you-should-681833by
函数扩展运算符