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:
parent
5c035974a2
commit
eea703a2c1
@ -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' } = {}) {
|
||||
@ -156,15 +170,15 @@ function m2({x, y} = { x: 0, y: 0 }) {
|
||||
m1() // [0, 0]
|
||||
m2() // [0, 0]
|
||||
|
||||
// x和y都有值的情况
|
||||
// x 和 y 都有值的情况
|
||||
m1({x: 3, y: 8}) // [3, 8]
|
||||
m2({x: 3, y: 8}) // [3, 8]
|
||||
|
||||
// x有值,y无值的情况
|
||||
// x 有值,y 无值的情况
|
||||
m1({x: 3}) // [3, 0]
|
||||
m2({x: 3}) // [3, undefined]
|
||||
|
||||
// x和y都无值的情况
|
||||
// x 和 y 都无值的情况
|
||||
m1({}) // [0, 0];
|
||||
m2({}) // [undefined, undefined]
|
||||
|
||||
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user