Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript default parameters for function

Tags:

I can fully understand ECMAScript 6 has created a lot of potential way of handling with functions such as arrow functions.

Since I'm not very familiar with the new stuff, when talking about default parameters for a function. How to interpret the differences between the following way of defining functions:

Function 1:

function m1({x = 0, y = 0} = {}) {
  return [x, y];
}

Function 2:

function m2({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}
like image 711
lsqleakey Avatar asked Feb 07 '17 15:02

lsqleakey


1 Answers

The difference is clear when you try passing something to your functions:

m1({}) // [0, 0]
m1({z: 1}) // [0, 0]
m1({x: 1}) // [1, 0]

m2({}) // [undefined, undefined]
m2({z: 1}) // [undefined, undefined]
m2({x: 1}) // [1, undefined]

Your first syntax (m1({x = 0, y = 0} = {})) does three things:

  • First, it provides a default first argument to the function, which is an empty object. If no first argument is given (m1()) then the default empty object is used (i.e. it becomes m1({}))
  • Second, your code extracts the x and y properties from that object.
  • If either is undefined, it is given a default value 0.

m2({x, y} = { x: 0, y: 0 }) does something quite different:

  • First it provides a default first parameter to the function, which is the object {x: 0, y: 0}. If no first argument is passed, that object is used. If any argument other than undefined is passed, that value is used instead.
  • Second, the code extracts the x and y properties from that object. If they are undefined, that's what you'll get.

The first option (a parameter with a default value that is destructured with more default values) is almost certainly what you want. The second option means that your code does not have sensible/useful default values for the property if arguments are passed.

like image 98
lonesomeday Avatar answered Sep 23 '22 10:09

lonesomeday