函数参数的解构赋值和函数参数的默认值


昨天在二刷阮一峰es6的时候,看到了一个思考题。

// 写法一
function m1({x = 0, y = 0} = {}) {
  return [x, y];
}

// 写法二
function m2({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

以上两种写法的差异在哪里?

写法一中m1函数的入参是一个对象(默认值为一个空对象),该对象有两个属性,x(默认值为0)和y(默认值为0)。

写法二中m2函数的入参是一个对象(默认值为一个对象,对象x和y属性都为0)。

// 函数没有参数的情况
m1() // [0, 0]
m2() // [0, 0]

// x 和 y 都有值的情况
m1({x: 3, y: 8}) // [3, 8]
m2({x: 3, y: 8}) // [3, 8]

// x 有值,y 无值的情况
m1({x: 3}) // [3, 0]
m2({x: 3}) // [3, undefined]

// x 和 y 都无值的情况
m1({}) // [0, 0];
m2({}) // [undefined, undefined]

m1({z: 3}) // [0, 0]
m2({z: 3}) // [undefined, undefined]

参考链接-阮一峰es6