15

With ES6 you can destructure objects in function arguments:

({name, value}) => { console.log(name, value) }

The equivalent ES5 would be:

function(params) { console.log(params.name, params.value) }

But what if I would like a reference both to the params object and the nested properties value and name? This is the closest I got, but the drawback is that it won't work with arrow functions because they do not have access to the arguments object:

function({name, value}) {
  const params = arguments[0]
  console.log(params, name, value)
}
webketje
  • 10,376
  • 3
  • 25
  • 54
  • 2
    `function(params){const {name,value}=params;console.log(params,name,value)}`? –  Mar 02 '18 at 18:17
  • @ProfessorAllman Yeah that comes very close. There's still an assignment line so I guess my question was: is it possible to do that in the function signature, like `function({name,value}=params) ` – webketje Mar 02 '18 at 18:19
  • no, it only makes the core hard to read and confusing specially when you start using arrow functions. no real benefit to it. – Dayan Moreno Leon Mar 02 '18 at 18:33
  • @DayanMorenoLeon I agree, was just curious – webketje Mar 02 '18 at 18:34

2 Answers2

7

arguments isn't available in arrow functions, and this affects how function parameters should be consistently treated in ES6.

If original parameter is used, it should be destructured inside function:

(param) => {
  const {name, value} = param;
  // ...
}

If several arguments are expected and some argument negotiation takes place (for example, similarly to arguments.length), rest parameter should be used:

(...args) => {
  const [param] = args;
  // ...
}

Boilerplate variable destructuring has its benefits; it's easier this way to debug param or args at breakpoint even if they aren't currently in use.

Estus Flask
  • 206,104
  • 70
  • 425
  • 565
  • Thanks, I think the answer gives a good summary of idiomatic use vs available options – webketje Mar 02 '18 at 19:56
  • Sure, you're welcome. I'm using this style myself as a rule of thumb, because param destructuring looks neat, but debugging was an issue for me numerous times in arrow callbacks. – Estus Flask Mar 02 '18 at 19:59
1

What about next:

function({name, value}, params=arguments[0]) {
    console.log(params, name, value)
}

Or:

function(params, {name, value} = params) {
    console.log(params, name, value)
}
Bohdan Kontsedal
  • 111
  • 3
  • 12