有没有人为javascript提出了一个Pipe运算符?

Jar*_*ith 7 javascript functional-programming

许多语言都有一个运算符,允许您将一个操作的结果传递给另一个操作的调用(例如|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"}
Run Code Online (Sandbox Code Playgroud)

与组成代码相比:

var something = func5(
    func4(
        func3(
            func2(
                func1(
                    somedata
                )
            )
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

从右到左,从下到上阅读.我意识到这可以通过功能组合来清理,但这不一定是重点.只是为了清楚地了解我正在寻找的东西:

var something = func1(somedata)
    |> func2
    |> func3
    |> func4
    //etc...
Run Code Online (Sandbox Code Playgroud)

在javascript中对管道运算符进行谷歌搜索主要会显示有关按位OR运算的信息.随着一些挖,但是我能挖了这个文章描述运算符重载的卑劣破解版本,可以实现什么我谈论的东西.我还挖掘了这个描述所述运算符的要点,并说"它已被提议用于javascript".

看看ES 2016,我看到了一个求幂运算符和绑定运算符的提议.两者都很有用,但不是我想要的.所以根据要点的标题,有没有人真的为javascript提出这个?

Jes*_*nan 14

2015年12月,ES7(ES2016)提出了管道运营商.

https://github.com/mindeavor/es-pipeline-operator


小智 5

正如已经提到的那样,已经为ES7(2016)提出了一个管道操作员,但如果你现在想要使用像babel这样的东西,这对我9个月之后遇到这个问题的确是如此.

据我所知,通过babel 支持es-pipeline-operator提案的最大障碍是目前无法使用|>或<|作为创建语法错误的运算符,并且无法修改而不会改变babel,不幸的是看起来问题不会是很快就解决了.

我个人希望看到管道后向运算符也添加到提案中,因为前向和后向都适用于不同的情况.

例如,我在修改函数时使用管道向后运算符,或者我通常在"管道"上使用"compose",在某些情况下我更喜欢这种管道的可读性.

const something = curry <| function(state, pattern) {
  // something
}

const something = function(state, pattern) {
  // something
} |> curry
Run Code Online (Sandbox Code Playgroud)

由于这些管道运营商是实用的风格的JavaScript编程和任何人谁来找我们使用这种权利像我这样的解决方案的好处非常有用,我已经使用了位运算符通天插件<<和>>我很少用它来实现目前正向和向后管道,在极少数需要按位运算符的情况下,使用该"no pipe";指令将禁用某个范围的插件.

https://github.com/michaelmitchell/babel-plugin-pipe-composition


ssu*_*ube 2

这个 github 存储库和其中我最喜欢的问题;) 讨论这个问题。

该提案已经在一个小范围的想法中讨论了几个月,但主要围绕使用->和作为和 的::糖,非常粗略。Function.prototype.applyFunction.prototype.bind

当前的草案是::位于作用域和函数 ( instance::method) 之间,其行为与 类似instance.method.bind(instance),锁定this任何调用的函数作用域。除此之外,->可以定义为传递范围和参数数组(如apply),因此instance->method(foo, bar)可以将 脱糖为instance.method.apply(instance, [foo, bar])。至少,这是正在讨论的方向之一(披露:这是我的看法)。