Javascript双冒号lambda

Javascript双冒号lambda,javascript,node.js,lambda,babeljs,Javascript,Node.js,Lambda,Babeljs,我知道Java中有一个双冒号(:)lambda,它允许您编写如下回调:Stream.of(new Object(),new Object()).map(Object::toString) 所以我想知道是否有一个Babel插件或任何其他方式可以在Javascript(NodeJS)中使用类似的lambda 编辑:不仅仅是使用本机对象。(例如:Person::name)Java方法可以是静态的,也可以不是静态的,参数和返回由类型暗示和已知编译时决定。JavaScript函数可以作为方法或静态调用,甚

我知道Java中有一个双冒号(:)lambda,它允许您编写如下回调:
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]' ]
如果只是引用该函数:

[{}, {}].map(Object.prototype.toString);
; ==> [ '[object Undefined]', '[object Undefined]' ]
原因是对象作为参数传递,而
Object.prototype.toString(“某物”)
试图在函数上下文中使用
这个
未定义的
。因为它不是作为方法调用的。您可以创建一个函数,它可以实现您想要的功能:

function mapMember(fn) {
  return (v) => fn.call(v);
}

[{}, {}].map(mapMember(Object.prototype.toString));
// ==> [ '[object Object]', '[object Object]' ]
我发现它过于冗长,所以我倾向于使用字符串:

function mapMember(str) {
  return v => v[str]();
}
[{}, {}].map(mapMember('toString'));
// ==> [ '[object Object]', '[object Object]' ]
使用相同的方法,您可以轻松创建获取字段的变体:

function mapProperty(str) {
  return v => v[str];
}
[{test: 'hello'}, {test: 'world'}].map(mapProperty('test'));
// ==> [ 'hello', 'world' ]
或者您可以同时执行以下两项操作:

function mapObject(str) {
  return v => typeof v[str] === 'function' ? v[str]() : v[str];
}
[{test: 'hello'}, { test() { return 'world!'; } }].map(mapObject('test'));
// ==> [ 'hello', 'world' ]
这样做的限制是,您永远不能收集成员函数,因为它们将被应用


请注意,有很多方法可以做到这一点,所以这只是一个如何将抽象应用于代码的示例

Javascript本机支持这一点,因为函数是一级对象。但是要小心这个