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];
}
m1
provides default values forx
andy
, whereasm2
merely destructuresx
andy
from a provided object and only provides default values if the object itself isn’t provided:m1({})
will return[0, 0]
m2({})
will return[undefined, undefined]
m1()
andm2()
will return[0, 0]
m1({x: 10})
will return[10, 0]
m2({x: 10})
will return[10, undefined]
So, if
m2
receives an object, it will destructure the available values to the variablesx
andy
. If any of them is missing, it’sundefined
. Only if the whole object is missing, it’ll provide a default object ({ x: 0, y: 0 }
) from which to get the values.m1
, however, provides default values for both properties even if they’re missing. And if the whole object is missing, it’ll still provide those default values.The difference is clear when you try passing something to your functions:
Your first syntax (
m1({x = 0, y = 0} = {})
) does three things:m1()
) then the default empty object is used (i.e. it becomesm1({})
)x
andy
properties from that object.undefined
, it is given a default value0
.m2({x, y} = { x: 0, y: 0 })
does something quite different:{x: 0, y: 0}
. If no first argument is passed, that object is used. If any argument other thanundefined
is passed, that value is used instead.x
andy
properties from that object. If they areundefined
, 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.