diff --git a/docs/function.md b/docs/function.md index e65e1d0..b46f7d8 100644 --- a/docs/function.md +++ b/docs/function.md @@ -86,11 +86,48 @@ fetch('http://example.com') 上面代码中,调用函数`fetch`时,第二个参数默认为一个空对象,而只要有第二个参数,`method`参数就默认为`GET`。 +请问下面两种写法有什么差别? + +```javascript +// 写法一 +function m1({x = 0, y = 0} = {}) { + return [x, y]; +} + +// 写法二 +function m2({x, y} = { x: 0, y: 0 }) { + return [x, y]; +} +``` + +上面两种写法都对函数的参数设定了默认值,区别是写法一对`x`和`y`设定了默认值,写法二没有。 + +```javascript +// 函数没有参数的情况 +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] +``` + 通常情况下,定义了默认值的参数,都是函数的尾参数。因为这样比较容易看出来,到底省略了哪些参数。但是,非尾部的参数,也是可以设置默认值的。 ```javascript // 例一 -function f(x=1, y) { +function f(x = 1, y) { return [x, y]; }