Dru*_*ney 5 javascript lambda node.js babeljs
我知道,在Java中有一个双冒号(::)拉姆达它允许你写的回调像以下:Stream.of(new Object(), new Object()).map(Object::toString)。
所以我想知道是否有 Babel 插件或任何其他方式在 Javascript (NodeJS) 中有类似的 lambda?
编辑:不仅仅是本机对象。(例如:Person::name)
Java 方法可以是静态的,也可以不是静态的,参数和返回值由类型提示和已知的编译时间决定。JavaScript 函数可以作为方法或静态调用,甚至可以是同一个函数,并且不知道传入或传出哪种类型,甚至不设置参数数量。由于无法进行类型推断,因此您需要清楚地说明您要做什么:
[{}, {}].map(o => o.toString());
; ==> [ '[object Object]', '[object Object]' ]
Run Code Online (Sandbox Code Playgroud)
如果您只是引用该函数:
[{}, {}].map(Object.prototype.toString);
; ==> [ '[object Undefined]', '[object Undefined]' ]
Run Code Online (Sandbox Code Playgroud)
原因是对象作为参数传递并尝试在函数上下文中Object.prototype.toString("something")使用this它。undefined因为它不是作为方法调用的。你可以创建一个函数来执行你想要的操作:
function mapMember(fn) {
return (v) => fn.call(v);
}
[{}, {}].map(mapMember(Object.prototype.toString));
// ==> [ '[object Object]', '[object Object]' ]
Run Code Online (Sandbox Code Playgroud)
我发现这过于冗长,所以我倾向于使用字符串:
function mapMember(str) {
return v => v[str]();
}
[{}, {}].map(mapMember('toString'));
// ==> [ '[object Object]', '[object Object]' ]
Run Code Online (Sandbox Code Playgroud)
使用相同的方法,您可以轻松制作一个获取字段的变体:
function mapProperty(str) {
return v => v[str];
}
[{test: 'hello'}, {test: 'world'}].map(mapProperty('test'));
// ==> [ 'hello', 'world' ]
Run Code Online (Sandbox Code Playgroud)
或者你可以两者都做:
function mapObject(str) {
return v => typeof v[str] === 'function' ? v[str]() : v[str];
}
[{test: 'hello'}, { test() { return 'world!'; } }].map(mapObject('test'));
// ==> [ 'hello', 'world' ]
Run Code Online (Sandbox Code Playgroud)
这样做的限制是您永远无法收集成员函数,因为它们将被应用。
请注意,有很多方法可以做到这一点,因此这只是如何将抽象应用于代码的示例。