mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2024-04-21 12:32:22 +00:00
edit function/default value
This commit is contained in:
+19
-13
@@ -15,7 +15,7 @@ log('Hello', 'China') // Hello China
|
||||
log('Hello', '') // Hello World
|
||||
```
|
||||
|
||||
上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。
|
||||
上面代码检查函数`log`的参数`y`有没有赋值,如果没有,则指定默认值为`World`。这种写法的缺点在于,如果参数`y`赋值了,但是对应的布尔值为`false`,则该赋值不起作用。就像上面代码的最后一行,参数`y`等于空字符,结果被改为默认值。
|
||||
|
||||
为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值。这有两种写法。
|
||||
|
||||
@@ -60,24 +60,30 @@ var p = new Point();
|
||||
默认值的写法非常灵活,下面是一个为对象属性设置默认值的例子。
|
||||
|
||||
```javascript
|
||||
fetch(url, { body = '', method = 'GET', headers = {} }){
|
||||
function fetch(url, { body = '', method = 'GET', headers = {} }){
|
||||
console.log(method);
|
||||
}
|
||||
|
||||
fetch('http://example.com', {})
|
||||
// "GET"
|
||||
```
|
||||
|
||||
上面代码中,传入函数fetch的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。
|
||||
上面代码中,传入函数`fetch`的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。
|
||||
|
||||
甚至还可以设置双重默认值。
|
||||
但是,这种写法不能省略第二个参数,为此可以设置双重默认值。
|
||||
|
||||
```javascript
|
||||
fetch(url, { method = 'GET' } = {}){
|
||||
function fetch(url, { method = 'GET' } = {}){
|
||||
console.log(method);
|
||||
}
|
||||
|
||||
fetch('http://example.com')
|
||||
// "GET"
|
||||
```
|
||||
|
||||
上面代码中,调用函数fetch时,如果不含第二个参数,则默认值为一个空对象;如果包含第二个参数,则它的method属性默认值为GET。
|
||||
上面代码中,调用函数`fetch`时,第二个参数默认为一个空对象,而只要有第二个参数,`method`参数就默认为`GET`。
|
||||
|
||||
定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。
|
||||
定义了默认值的参数,必须是函数的尾参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。
|
||||
|
||||
```javascript
|
||||
// 以下两种写法都是错的
|
||||
@@ -89,7 +95,7 @@ function f(x, y = 5, z) {
|
||||
}
|
||||
```
|
||||
|
||||
如果传入undefined,将触发该参数等于默认值,null则没有这个效果。
|
||||
如果传入`undefined`,将触发该参数等于默认值,null则没有这个效果。
|
||||
|
||||
```javascript
|
||||
function foo(x = 5, y = 6){
|
||||
@@ -100,9 +106,9 @@ foo(undefined, null)
|
||||
// 5 null
|
||||
```
|
||||
|
||||
上面代码中,x参数对应undefined,结果触发了默认值,y参数等于null,就没有触发默认值。
|
||||
上面代码中,`x`参数对应`undefined`,结果触发了默认值,`y`参数等于`null`,就没有触发默认值。
|
||||
|
||||
指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。
|
||||
指定了默认值以后,函数的`length`属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,`length`属性将失真。
|
||||
|
||||
```javascript
|
||||
(function(a){}).length // 1
|
||||
@@ -110,7 +116,7 @@ foo(undefined, null)
|
||||
(function(a, b, c = 5){}).length // 2
|
||||
```
|
||||
|
||||
上面代码中,length属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。
|
||||
上面代码中,`length`属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。
|
||||
|
||||
利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。
|
||||
|
||||
@@ -127,9 +133,9 @@ foo()
|
||||
// Error: Missing parameter
|
||||
```
|
||||
|
||||
上面代码的foo函数,如果调用的时候没有参数,就会调用默认值throwIfMissing函数,从而抛出一个错误。
|
||||
上面代码的`foo`函数,如果调用的时候没有参数,就会调用默认值`throwIfMissing`函数,从而抛出一个错误。
|
||||
|
||||
从上面代码还可以看到,参数mustBeProvided的默认值等于throwIfMissing函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。
|
||||
从上面代码还可以看到,参数`mustBeProvided`的默认值等于`throwIfMissing`函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。
|
||||
|
||||
另一个需要注意的地方是,参数默认值所处的作用域,不是全局作用域,而是函数作用域。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user