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

时间:2016-12-11 10:28:50

标签: javascript typescript ecmascript-6 arrow-functions

我在一个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());
}

5 个答案:

答案 0 :(得分:69)

可以使用此样式的原因(以及可能使用此样式的原因)是_()短一个字符。

可选括号与optional curly brackets属于同一样式问题。这在很大程度上是品味和代码风格的问题,但是由于一致性,这里的详细程度很受欢迎。

虽然箭头函数允许单个参数没有括号,但它与零,单个结构化,单个休息和多个参数不一致:

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

虽然对于下划线参数is declared but never used错误was fixed in TypeScript 2.0_也可以从linter或IDE触发unused variable/parameter警告。对于这样做,这是一个相当大的争论。

_可以通常用于忽略的参数(正如已经解释过的另一个答案)。虽然这可能被认为是可以接受的,但这种习惯可能会导致与_ Underscore / Lodash名称空间发生冲突,当有多个被忽略的参数时,这看起来也会让人感到困惑。由于这个原因,有正确命名的下划线参数(在TS 2.0中支持)是有益的,也节省了确定函数签名的时间以及为什么参数被标记为忽​​略(这违反了_参数作为捷径的目的):

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

由于上面列出的原因,我个人认为_ => { ... }代码风格应该避免使用。

答案 1 :(得分:49)

  

()语法更好地传达了意图imho,也更具特定类型

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

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

因此,从类型的角度来看,它可能更准确(特别是当您不使用any键入它时,例如_: Event)。正如你所说,键入的一个字符更少,在某些键盘上也更容易触及。

答案 2 :(得分:21)

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

_在Go中很受欢迎,它也在Dart中使用,表示参数被忽略,可能还有其他我不了解的参数。

答案 3 :(得分:9)

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

这种区别可能如下例所示:

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)

答案 4 :(得分:-1)

我写这篇文章时给人的印象是_是创建没有()的箭头函数的唯一方法,这使我相信使用_可能会有一些次要的优势,但是我错了。 @Halt在注释中确认它的行为与其他变量一样,这不是特殊的语言构造。


我想提一提关于这些下划线箭头功能的另一件事,我在测试自己时没有发现任何地方提到过。 您可以可以使用函数中的下划线作为参数,尽管这可能不适合使用,因为它应该表示未使用的参数。为了清楚起见,我真的不建议使用这种方式。 ,但是对于诸如codegolf之类的事情,编写最短代码的挑战(事实证明,您可以不使用()就可以使用任何字符)很有用。我可以想象一些实际的用例,其中库使用了此功能,即使它们不打算使用该功能,您也需要使用它。

示例:

// simple number doubling function
f = _=> {
    _ = _ * 2;
    return _;
}

console.log(f(2)); // returns 4
console.log(f(10)); // returns 20

在Chrome控制台上测试,版本为76.0.3809.132(正式版本)(64位)