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