函数扩展运算符_如何在函数上使用扩展运算符

函数扩展运算符

您不能正式做到这一点,但是您可以编写一个功能大致相同的函数。 让我们看看您应该怎么做,也许为什么。

但是首先,您是否遇到过这种情况?

const result = f(x)

if (result === undefined ) {
	g(x)
}

当另一个函数针对同一输入返回未定义时,您想用输入调用一个函数。 上面的作品,但是如果我们更概括一些,那会不会很好?

如果我们使用对象,则可以使用散布运算符很好地完成。

const combinedObj = {...gObj, ...fObj}

that看起来不漂亮吗? 当我调用combinedObj[x] ,它将返回fObj[x]除非undefinedx undefined fObj 。 在这种情况下,将返回gObj[x] 。 但是真正的好处是我可以对任意数量的对象进行处理。

const combinedObj = {...gObj, ...fObj, ...hObj, ...iObj, ...jObj}

那么,我们如何可以定义可以同样波及其他功能如何的功能利差对象?

眼镜

好吧, spread应该可以使用两个函数fg

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语句在做什么,花了更少的脑力。 这是我们使用mapreduce的相同原因。 有许多方法可以实现不使用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

函数扩展运算符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值