JavaScript双冒号Lambda

5
我知道在Java中有一个双冒号(::)lambda,它允许你编写回调函数,例如:Stream.of(new Object(), new Object()).map(Object::toString)
所以我想知道是否有一种类似的lambda在Javascript(NodeJS)中可以使用,是否有Babel插件或其他方法可以实现?
编辑:不仅限于原生对象。(例如:Person::name)

1
Javascript本身就支持此功能,因为函数是一等对象。但要注意this - SLaks
1个回答

3

Java方法可以是静态的或非静态的,其参数和返回值由类型提示和已知的编译时确定。JavaScript函数可以作为方法或静态调用,即使是同一个函数,也不知道要输入或输出哪种类型,甚至参数数量也未定。由于无法进行类型推断,因此需要明确说明您要做什么:

[{}, {}].map(o => o.toString());
; ==> [ '[object Object]', '[object Object]' ]

如果你只是引用这个函数:

[{}, {}].map(Object.prototype.toString);
; ==> [ '[object Undefined]', '[object Undefined]' ]

原因是对象作为参数传递,Object.prototype.toString("something")试图使用this,但在函数环境中this是未定义的,因为它不是被调用作为方法。但你可以编写一个满足你需求的函数:

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' ]

这种方法的限制在于您永远不能收集成员函数,因为它们将被应用。

请注意,有许多方法可以实现这一点,所以这只是将抽象应用到代码中的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接