是否有官方方法将管道函数的头作为普通函数参数传递?就像如何使用 .call
修改函数一样和.bind
,我想修改 String.prototype.includes 使其看起来像 includes('a')('acd')
。基本上,我想要一个使其第一个参数为“abc”的函数,即 String.prototype.includes('a')
中的 String 实例。
他是我最好的尝试...但这行不通,因为,为什么会这样
['abc'].some(String.prototype.includes('b'))
基本上我想要一个很酷、令人困惑的版本
x => x.includes('b')
Javascript 中是否有一个版本的 call、bind 或 depipe 方法可以满足我的需要?
最佳答案
没有内置方法可以执行此操作。忽略像 ramda/lodash.fp 这样允许您通过帮助器方法执行此操作的库 - 您将需要实现自己的帮助器。由于参数是“相反的”,你不能简单地进行 eta-reduce(避免额外的 lambda):
// all these functions exist in Ramda
function makeThisAnArgument(fn) { // uncurry this
return (arg, ...args) => fn.call(arg, ...args)
}
function reverseArguments(fn) {
return (...args) => fn.call(null, ...args.reverse());
}
// this would let you easily do:
const reversed = reverseArguments(makeThisAnArgument(String.prototype.includes))
const includesA = reversed.bind(null, 'a');
includesA('abc'); // true
includesA('bc'); // false
总的来说,请考虑查看有关 Ramda 的精彩讨论 Hey Underscore, You're doing it Wrong!这解释了启用可组合 API 所需的调用顺序、约定和方法签名,例如您所要求的 Ramda 公开的 API。
关于javascript - 有没有 Javascript depipe 方法?类似于绑定(bind)或调用,但用于取消管道原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67725634/