许多语言都有一个运算符,允许您将一个操作的结果传递给另一个操作的调用(例如bash中的|
运算符,F#中的|>
运算符。)
我认为javascript中方法链接的常用习惯的一大优点是它从上到下,从左到右读取:
var fooOddSquares = [1, 2, 3, 4, 5]
.filter(x => x % 2)
.map(x => "foo" + x * x)
.reduce(((acc, str, i) => acc[i + 1] = str; return acc), {});
// => {1: "foo1", 2: "foo9", 3: "foo25"}
与成分代码比较:
var something = func5(
func4(
func3(
func2(
func1(
somedata
)
)
)
)
);
从右到左,从下到上阅读。我意识到这可以通过功能组合来清理,但这不一定是重点。只是为了清楚地了解我正在寻找的东西:
var something = func1(somedata)
|> func2
|> func3
|> func4
//etc...
在javascript中对管道运算符进行谷歌搜索主要会显示有关按位OR运算的信息。然而,通过一些挖掘,我能够挖掘出this文章,描述了操作符重载的脏兮兮的版本,它可以实现我正在谈论的内容。我还发掘了this用于描述所述运算符的要点,并说“它已被提议用于javascript”。
看看ES 2016,我看到了一个求幂运算符和绑定运算符的提议。两者都很有用,但不是我想要的。那么根据要点的标题,有没有人真的为javascript提出这个?
答案 0 :(得分:14)
2015年12月,ES7(ES2016)已提出管道运营商。
答案 1 :(得分:5)
如前所述,已经为ES7(2016)提出了一个管道运营商,但是如果你现在想要使用像babel这样的东西,这对我9个月以后遇到这个问题的方式并没有多大帮助。
据我所知,通过babel支持es-pipeline-operator提案的最大障碍是当前无法使用|>
或<|
作为创建语法错误的运算符,如果没有对巴贝尔的改变,不幸的是,问题似乎不会很快得到解决。
我个人希望看到管道后向运算符也添加到提案中,因为前向和后向都适用于不同情况。
例如,我在修改函数时使用管道反向运算符,或者在通常使用的任何地方使用&#34;撰写&#34; over&#34; pipe&#34;在某些情况下我更喜欢它的可读性。
const something = curry <| function(state, pattern) {
// something
}
const something = function(state, pattern) {
// something
} |> curry
因为这些管道运算符在函数式javascript编程中非常有用,并且对于那些像我一样现在正在寻找解决方案来使用它的人来说,我已经创建了一个使用按位运算符的babel插件{{1}和<<
我很少用它来实现前向和后向管道,并且在极少数需要按位运算符的情况下使用>>
指令将禁用某个插件范围。
https://github.com/michaelmitchell/babel-plugin-pipe-composition
答案 2 :(得分:2)
This github repo和my favorite issue within it;)只讨论这个问题。
这个提案已经在一小部分想法中移动了几个月,但围绕着使用->
和::
作为Function.prototype.apply
和Function.prototype.bind
周围的糖,大致。
目前的草稿是::
位于范围和功能(instance::method
)之间,与instance.method.bind(instance)
非常相似,锁定了this
范围内的任何功能调用。除此之外,->
可以定义为传递范围和参数数组(如apply
),因此instance->method(foo, bar)
可以去instance.method.apply(instance, [foo, bar])
。至少,这是正在讨论的方向之一(披露:这是我的看法)。