周末可能会介意这一点,我很想知道当一个链接方法在一起时到底发生了什么,如下面的代码:
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)
不确定在哪里可以更好地理解这一点,所以如果你能指出我正确的方向,我会去阅读它。我很想知道,非常感谢你提供的信息。
答案 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);
}