1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

docs(function): edit function

This commit is contained in:
ruanyf 2017-08-12 10:53:44 +08:00
parent 5c035974a2
commit eea703a2c1

View File

@ -67,6 +67,12 @@ function foo(x = 5) {
使用参数默认值时,函数不能有同名参数。
```javascript
// 不报错
function foo(x, x, y) {
// ...
}
// 报错
function foo(x, x, y = 1) {
// ...
}
@ -98,15 +104,25 @@ function foo({x, y = 5}) {
console.log(x, y);
}
foo({}) // undefined, 5
foo({x: 1}) // 1, 5
foo({x: 1, y: 2}) // 1, 2
foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() // TypeError: Cannot read property 'x' of undefined
```
上面代码使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数`foo`的参数是一个对象时,变量`x``y`才会通过解构赋值生成。如果函数`foo`调用时参数不是对象,变量`x``y`就不会生成,从而报错。如果参数对象没有`y`属性,`y`的默认值5才会生效
上面代码使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数`foo`的参数是一个对象时,变量`x``y`才会通过解构赋值生成。如果函数`foo`调用时没提供参数,变量`x``y`就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况
下面是另一个对象的解构赋值默认值的例子。
```javascript
function foo({x, y = 5} = {}) {
console.log(x, y);
}
foo() // undefined 5
```
上面代码指定,如果没有提供参数,函数`foo`的参数默认为一个空对象。
下面是另一个解构赋值默认值的例子。
```javascript
function fetch(url, { body = '', method = 'GET', headers = {} }) {
@ -120,9 +136,7 @@ fetch('http://example.com')
// 报错
```
上面代码中,如果函数`fetch`的第二个参数是一个对象,就可以为它的三个属性设置默认值。
上面的写法不能省略第二个参数,如果结合函数参数的默认值,就可以省略第二个参数。这时,就出现了双重默认值。
上面代码中,如果函数`fetch`的第二个参数是一个对象,就可以为它的三个属性设置默认值。这种写法不能省略第二个参数,如果结合函数参数的默认值,就可以省略第二个参数。这时,就出现了双重默认值。
```javascript
function fetch(url, { method = 'GET' } = {}) {
@ -225,7 +239,7 @@ foo(undefined, null)
上面代码中,`length`属性的返回值等于函数的参数个数减去指定了默认值的参数个数。比如上面最后一个函数定义了3个参数其中有一个参数`c`指定了默认值,因此`length`属性等于`3`减去`1`,最后得到`2`
这是因为`length`属性的含义是该函数预期传入的参数个数。某个参数指定默认值以后预期传入的参数个数就不包括这个参数了。同理rest 参数也不会计入`length`属性。
这是因为`length`属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会计入`length`属性。
```javascript
(function(...args) {}).length // 0