在 ES6/Typescript 中使用带有箭头函数的 _(下划线)变量

IT技术 javascript typescript ecmascript-6 arrow-functions
2021-01-26 01:55:15

我在一个 Angular 示例中遇到了这个构造,我想知道为什么选择它:

_ => console.log('Not using any parameters');

我知道变量_意味着不关心/不使用,但由于它是唯一的变量,因此有任何理由更喜欢使用_over:

() => console.log('Not using any parameters');

当然,这不能少打一个字符。()语法传达在我看来,意图更好,也更具体的类型,否则我认为第一个例子应该是这个样子的:

(_: any) => console.log('Not using any parameters');

如果重要,这是使用它的上下文:

submit(query: string): void {
    this.router.navigate(['search'], { queryParams: { query: query } })
      .then(_ => this.search());
}
4个回答

可以使用这种样式的原因(也可能是这里使用它的原因)是它_().

可选括号与可选大括号属于相同的样式问题这在很大程度上是一个品味和代码风格的问题,但由于一致性,这里更喜欢冗长。

虽然箭头函数允许单个参数不带括号,但它与零、单个解构、单个休息和多个参数不一致:

let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };

尽管TypeScript 2.0中下划线参数的is declared but never used错误已修复_但也可能触发unused variable/parameter来自 linter 或 IDE 的警告。这是反对这样做的一个相当大的论据。

_可以按惯例用于忽略的参数(正如其他答案已经解释过的)。虽然这可能被认为是可以接受的,但这种习惯可能会导致与_Underscore/Lodash 命名空间的冲突,当有多个忽略的参数时也会看起来很混乱。出于这个原因,正确命名下划线参数是有益的(TS 2.0 支持),还可以节省找出函数签名以及为什么参数被标记为忽​​略的时间(这违背了_参数作为快捷方式的目的):

let fn = (param1, _unusedParam2, param3) => { ... };

由于上面列出的原因,我个人认为_ => { ... }代码风格是一种应该避免的坏语气。

这是一个字符短,但它对于大多数IDE相同数量的按键,因为按(通常有一个)我个人更喜欢使用 pfor 参数,我也想知道它是否有任何性能问题
2021-03-28 01:55:15
@Mojimi 但是,您可能必须按)或向右箭头键才能跳过该字符。
2021-04-10 01:55:15

()语法传达的意图更好恕我直言,也是更具体的类型

不完全是。()表示该函数不需要任何参数,它不声明任何参数。函数.length为 0。

如果您使用_,它会明确声明该函数将被传递一个参数,但您并不关心它。该函数.length将为 1,这在某些框架中可能很重要。

因此,从类型的角度来看,这样做可能更准确(尤其是当您不使用anybut 输入时,例如,_: Event)。正如您所说,键入的字符少一个,这在某些键盘上也更容易到达。

我不确定我是否遵循了您的第二段。下划线如何暗示您不打算使用它?你当然可以,对吧?
2021-03-15 01:55:15
我的第一个想法是 _ 使得在尝试理解函数时没有需要考虑的参数按照惯例很明显。使用 () 使其明确,无需扫描代码即可使用 _ (这将违反约定)。但是你睁开眼睛也考虑了记录传递给函数的值的value,否则这并不总是显而易见的。
2021-03-23 01:55:15
@isherwood 你可以,是的,但是你应该给它一个合适的名字(即使像e“事件”这样的缩写)。的约定是 _识别一个未使用的变量
2021-03-29 01:55:15
我刚刚意识到我的代码充满了未使用的_s 箭头函数变量,我想知道与使用相比是否有任何性能差异()
2021-04-10 01:55:15

我猜_ =>只是用过了,() =>因为_在其他语言中很常见,不允许像在 JS 中那样省略参数。

_ 在 Go 中很流行,在 Dart 中也使用它来表示参数被忽略,可能还有其他我不知道的参数。

我认为 Python 也遵循这个约定。
2021-03-15 01:55:15
这种用法_大概是从 ML 和 Haskell 等函数式语言借来的,在这些语言中,它早于 Python 的发明(更不用说 Go、Dart 或 TypeScript)了。
2021-03-22 01:55:15
Scala 喜欢下划线(includehelp.com/scala/use-of-underscore-in-scala.aspx)。在 Scala 对带下划线的匿名类型所做的事情之后,更多的语言采用了哪些语言。
2021-03-23 01:55:15
我猜 Scala 也从其他语言中获取了它。编程语言中几乎没有任何东西在 70 年代就已经不存在了 :D 主要是将这些东西结合起来的新方法。
2021-04-07 01:55:15
Ruby 也这样做(po-ru.com/diary/rubys-magic-underscore)和 F#(以及其他受 ML 系列影响的语言)
2021-04-09 01:55:15

可以区分这两种用法,一些框架使用它来表示不同类型的回调。例如我认为节点表达框架使用它来区分中间件的类型,例如错误处理程序使用三个参数,而路由使用两个。

这种区分可能类似于以下示例:

const f1 = () => { } // A function taking no arguments
const f2 = _ => { }  // A function with one argument that doesn't use it

function h(ff) { 
  if (ff.length === 0) {
    console.log("No argument function - calling directly");
    ff();
  } else if (ff.length === 1) {
    console.log("Single argument function - calling with 1");
    ff(1);
  }
}

h(f1);
h(f2);

这是基于 Bergi 的回答,但我认为添加一个示例比我乐意对其他人的帖子进行更多的编辑。