JavaScript Empty parentheses vs underscore for ES6 no-args arrow functions [duplicate]

I came across this construct in an Angular example and I wonder why this is chosen:

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

I understand that the variable _ means don't care/not used but since it is the only variable is there any reason to prefer the use of _ over:

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

Surely this can't be about one character less to type. The () syntax conveys the intent better in my opinion and is also more type specific because otherwise I think the first example should have looked like this:

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

In case it matters, this was the context where it was used:

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

The reason why this style can be used (and possibly why it was used here) is that _ is one character shorter than ().

Optional parentheses fall into the same style issue as optional curly brackets. This is a matter of taste and code style for the most part, but verbosity is favoured here because of consistency.

While arrow functions allow a single parameter without parentheses, it is inconsistent with zero, single destructured, single rest and multiple parameters:

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

Although is declared but never used error was fixed in TypeScript 2.0 for underscored parameters, _ can also trigger unused variable/parameter warning from a linter or IDE. This is a considerable argument against doing this.

_ can be conventionally used for ignored parameters (as the other answer already explained). While this may be considered acceptable, this habit may result in a conflict with _ Underscore/Lodash namespace, also looks confusing when there are multiple ignored parameters. For this reason it is beneficial to have properly named underscored parameters (supported in TS 2.0), also saves time on figuring out function signature and why the parameters are marked as ignored (this defies the purpose of _ parameter as a shortcut):

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

For the reasons listed above, I would personally consider _ => { ... } code style a bad tone that should be avoided.

Answer:2

The () syntax conveys the intent better imho and is also more type specific

Not exactly. () says that the function does not expect any arguments, it doesn't declare any parameters. The function's .length is 0.

If you use _, it explicitly states that the function will be passed one argument, but that you don't care about it. The function's .length will be 1, which might matter in some frameworks.

So from a type perspective, it might be more accurate thing to do (especially when you don't type it with any but, say, _: Event). And as you said, it's one character less to type which is also easier to reach on some keyboards.

Answer:3

I guess _ => is just used over () => because _ is common in other languages where it is not allowed to just omit parameters like in JS.

_ is popular in Go and it's also used in Dart to indicate a parameter is ignored and probably others I don't know about.

Answer:4

It is possisble to distinguish between the two usages, and some frameworks use this to represent different types of callbacks. For example I think nodes express framework uses this to distinguish between types of middleware, for example error handlers use three arguments, while routing uses two.

Such differentiation can look like the example below:

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)
Answer:5

I am trying to run a script in a new tab. The code I use is this: $ = jQuery; function openAndPush(url, id) { var win = window.open('https://example.com' + url + '?view=map'); var element = $(...

I am trying to run a script in a new tab. The code I use is this: $ = jQuery; function openAndPush(url, id) { var win = window.open('https://example.com' + url + '?view=map'); var element = $(...

I have a function that catches whether the input has changed or not then if the value is exceeding the max it sets the value to the max. So you can not enter a value over the max. But if you try to do ...

I have a function that catches whether the input has changed or not then if the value is exceeding the max it sets the value to the max. So you can not enter a value over the max. But if you try to do ...

I have Set() object with three key value var myset =new Set(); myset.add('first','This is first value'); myset.add('second','This is second value'); myset.add('third','This is third value'); Using ...

I have Set() object with three key value var myset =new Set(); myset.add('first','This is first value'); myset.add('second','This is second value'); myset.add('third','This is third value'); Using ...

  1. individual value at risk
  2. individual value of privacy
  3. individual value in excel
  4. individual value of friendship
  5. individual value of human life
  6. individual value of
  7. individual value in english

How can I display this code &#8203; for the user to copy without adding spaces I tried to add code tags <code>&#8203;</code> but didn't work how can I do it ?

How can I display this code &#8203; for the user to copy without adding spaces I tried to add code tags <code>&#8203;</code> but didn't work how can I do it ?

  1. html display blank image
  2. html display blank space
  3. display blank html