Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ES6/Typescript中使用带箭头函数的uz(下划线)变量_Javascript_Typescript_Ecmascript 6_Arrow Functions - Fatal编程技术网

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

Javascript 在ES6/Typescript中使用带箭头函数的uz(下划线)变量,javascript,typescript,ecmascript-6,arrow-functions,Javascript,Typescript,Ecmascript 6,Arrow Functions,我在一个角度示例中遇到了这个构造,我想知道为什么选择它: _ => console.log('Not using any parameters'); 我理解变量u意味着不在乎/不使用,但因为它是唯一的变量,所以有任何理由更喜欢使用u而不是: () => console.log('Not using any parameters'); 当然,这不能少输入一个字符。在我看来,()语法更好地表达了意图,而且更具体于类型,因为否则我认为第一个示例应该是这样的: (_: any) =>

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

_ => console.log('Not using any parameters');
我理解变量u意味着不在乎/不使用,但因为它是唯一的变量,所以有任何理由更喜欢使用u而不是:

() => 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());
}

我猜
\u=>
只是在
()=>
上使用,因为
\u=/code>在其他语言中很常见,不允许像JS那样省略参数

\u
在围棋中很流行,它也在Dart中用来表示一个参数被忽略,可能还有其他我不知道的参数

()
语法更好地传达了imho的意图,并且更特定于类型

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

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


因此,从类型的角度来看,这可能是更准确的操作(尤其是当您不使用
any
而使用
\uu:Event
键入时)。正如你所说的,打字只需少一个字符,在某些键盘上也更容易达到。

之所以可以使用这种风格(可能在这里使用它),是因为
()
短一个字符

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

虽然箭头函数允许单个参数不带括号,但它与零、单个非结构化、单个rest和多个参数不一致:

let zeroParamFn = () => { ... };
let oneParamFn = param1 => { ... };
let oneParamDestructuredArrFn = ([param1]) => { ... };
let oneParamDestructuredObjFn = ({ param1 }) => { ... };
let twoParamsFn = (param1, param2) => { ... };
let restParamsFn = (...params) => { ... };
虽然声明了
,但从未对带下划线的参数使用过
错误,
\uuu
也可以从linter或IDE触发
未使用的变量/参数
警告。这是反对这样做的相当大的理由

\u
通常可用于被忽略的参数(另一个答案已经解释过)。虽然这可能被认为是可以接受的,但这种习惯可能会导致与
\uuu
下划线/Lodash名称空间发生冲突,当存在多个被忽略的参数时,这看起来也很混乱。因此,正确命名带下划线的参数(TS 2.0中支持)是有益的,还可以节省计算函数签名以及参数被标记为忽略的原因的时间(这违背了
\ucode>参数作为快捷方式的目的):


由于上面列出的原因,我个人会考虑代码< >={…} /COD>代码风格是应该避免的坏音。

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

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

const f1=()=>{}//一个不带参数的函数
const f2==>{}//一个函数,有一个参数不使用它
函数h(ff){
如果(ff.length==0){
log(“无参数函数-直接调用”);
ff();
}else if(ff.length==1){
log(“单参数函数-使用1调用”);
ff(1);
}
}
h(f1);

h(f2)您如何担心类型或专用性的参数,它从来没有被使用过?我是一个C++开发者,通过交易,我想我总是担心类型的特殊性:-)个人的模式减少括号的数目,使它更容易阅读:doSuffe()。我的第一个想法是,通过惯例,当试图理解函数时,没有理由考虑。使用()使其显式化,无需扫描代码以查找x的可能用法(这将违反约定)。但是您打开了我的眼睛,也考虑了文档的价值,即有一个值传递给函数,否则它将不总是明显的。我只是意识到我的代码中满是未使用的<代码> s箭头函数变量,我想知道与使用<代码>(相比)是否有任何性能差异。
Python也遵循这个惯例,我想,
的这种用法大概是从函数式语言(比如ML和Haskell)借用来的,它们早在Python发明之前就已经存在了(更不用说Go、Dart或TypeScript了)。Ruby也这样做()和F#(以及受ML家族影响的其他语言)Scala()。在Scala使用带下划线的匿名类型之后,还有哪些语言采用了其他语言呢。在70年代的编程语言中几乎没有什么东西是不存在的,主要是结合这些东西的新方法。这是基于Bergi的回答,但我认为添加一个示例比我在别人的帖子上乐意做的编辑要多一些。它短了一个字符,但大多数IDE的按键次数相同,因为按下
通常带有
。我个人更喜欢使用
p
作为参数,我也不知道它是否有任何性能issue@Mojimi但是,您可能需要按
或右箭头键跳过该字符。
let fn = (param1, _unusedParam2, param3) => { ... };