JavaScript中的菊花链方法

时间:2018-02-05 11:23:13

标签: javascript arrays

周末可能会介意这一点,我很想知道当一个链接方法在一起时到底发生了什么,如下面的代码:

const posts = [{}, {}, {}, ...]

posts
  .filter(({ node }) => node.fields.slug !== '/about/')
  .reverse()
  .slice(0, 5)

每个Array.prototype方法在以某种方式转换数据后返回一个数组。 filter& slice都返回原始数组的副本,并且存在规定的转换。我很想知道的是,JavaScript是否正在执行一些内部管道,就像我在elixir中看到的那样。我认为每个方法都需要一个数组才能工作,但不一定是一个参数。

我不相信以上内容类似于。我知道第一个arg必须是管道运算符在elixir中工作的先前操作返回的任何内容:

posts
  |> filter(({ node }) => node.fields.slug !== '/about/')
  |> reverse()
  |> slice(0,5)

不确定在哪里可以更好地理解这一点,所以如果你能指出我正确的方向,我会去阅读它。我很想知道,非常感谢你提供的信息。

1 个答案:

答案 0 :(得分:3)

没有什么比返回this或其他新对象更复杂了。一个简单的例子是:

function Num(val) { // Num contructor
    this.val = val;
};

Num.prototype.increment = function () {
    this.val++;
    return this;
}

Num.prototype.decrement = function () {
    this.val--;
    return this;
}

Num.prototype.getVal = function(){
    return this.val;
}

var num = new Num(0);
num.increment().increment().decrement().increment();
console.log(num.getVal()); // 2

非链接方式是:

var num = new Num(0);
num.increment();
num.increment();
num.decrement();
num.increment();
console.log(num.getVal()); // 2

使用链接的一个很好的理由是当方法返回一个新的不可变对象(例如字符串)但你不关心中间对象时,你只需要最终的结果:

var username = " Dave"; // user input with leading whitespace
var lowercase = username.trim().toLowerCase(); // "dave"

在这种情况下不使用链接不会产生所需的结果(没有空格):

var username = " Dave"; // user input with leading whitespace
username.trim();
var lowercase = username.toLowerCase(); // " dave"

如果你重新分配了返回值,你仍然可以避免链接:

var username = " Dave"; // user input with leading whitespace
var lowercase = username.trim();
lowercase = lowercase.toLowerCase(); // "dave"

为了完整起见,如果你想让上面的Num示例成为不可变的:

Num.prototype.increment = function () {
    return new Num(this.val + 1);
}