@@ -15,7 +15,7 @@ log('Hello', 'China') // Hello China
15
15
log (' Hello' , ' ' ) // Hello World
16
16
```
17
17
18
- 上面代码检查函数log的参数y有没有赋值 ,如果没有,则指定默认值为World 。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false ,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符 ,结果被改为默认值。
18
+ 上面代码检查函数 ` log ` 的参数 ` y ` 有没有赋值 ,如果没有,则指定默认值为 ` World ` 。这种写法的缺点在于,如果参数 ` y ` 赋值了,但是对应的布尔值为 ` false ` ,则该赋值不起作用。就像上面代码的最后一行,参数 ` y ` 等于空字符 ,结果被改为默认值。
19
19
20
20
为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值。这有两种写法。
21
21
@@ -60,24 +60,30 @@ var p = new Point();
60
60
默认值的写法非常灵活,下面是一个为对象属性设置默认值的例子。
61
61
62
62
``` javascript
63
- fetch (url , { body = ' ' , method = ' GET' , headers = {} }){
63
+ function fetch (url , { body = ' ' , method = ' GET' , headers = {} }){
64
64
console .log (method);
65
65
}
66
+
67
+ fetch (' http://example.com' , {})
68
+ // "GET"
66
69
```
67
70
68
- 上面代码中,传入函数fetch的第二个参数是一个对象 ,调用的时候可以为它的三个属性设置默认值。
71
+ 上面代码中,传入函数 ` fetch ` 的第二个参数是一个对象 ,调用的时候可以为它的三个属性设置默认值。
69
72
70
- 甚至还可以设置双重默认值 。
73
+ 但是,这种写法不能省略第二个参数,为此可以设置双重默认值 。
71
74
72
75
``` javascript
73
- fetch (url , { method = ' GET' } = {}){
76
+ function fetch (url , { method = ' GET' } = {}){
74
77
console .log (method);
75
78
}
79
+
80
+ fetch (' http://example.com' )
81
+ // "GET"
76
82
```
77
83
78
- 上面代码中,调用函数fetch时,如果不含第二个参数,则默认值为一个空对象;如果包含第二个参数,则它的method属性默认值为GET 。
84
+ 上面代码中,调用函数 ` fetch ` 时,第二个参数默认为一个空对象,而只要有第二个参数, ` method ` 参数就默认为 ` GET ` 。
79
85
80
- 定义了默认值的参数,必须是函数的尾部参数 ,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。
86
+ 定义了默认值的参数,必须是函数的尾参数 ,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。
81
87
82
88
``` javascript
83
89
// 以下两种写法都是错的
@@ -89,7 +95,7 @@ function f(x, y = 5, z) {
89
95
}
90
96
```
91
97
92
- 如果传入undefined ,将触发该参数等于默认值,null则没有这个效果。
98
+ 如果传入 ` undefined ` ,将触发该参数等于默认值,null则没有这个效果。
93
99
94
100
``` javascript
95
101
function foo (x = 5 , y = 6 ){
@@ -100,17 +106,17 @@ foo(undefined, null)
100
106
// 5 null
101
107
```
102
108
103
- 上面代码中,x参数对应undefined ,结果触发了默认值,y参数等于null ,就没有触发默认值。
109
+ 上面代码中,` x ` 参数对应 ` undefined ` ,结果触发了默认值,` y ` 参数等于 ` null ` ,就没有触发默认值。
104
110
105
- 指定了默认值以后,函数的length属性 ,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真 。
111
+ 指定了默认值以后,函数的 ` length ` 属性 ,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,` length ` 属性将失真 。
106
112
107
113
``` javascript
108
114
(function (a ){}).length // 1
109
115
(function (a = 5 ){}).length // 0
110
116
(function (a , b , c = 5 ){}).length // 2
111
117
```
112
118
113
- 上面代码中,length属性的返回值 ,等于函数的参数个数减去指定了默认值的参数个数。
119
+ 上面代码中,` length ` 属性的返回值 ,等于函数的参数个数减去指定了默认值的参数个数。
114
120
115
121
利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。
116
122
@@ -127,9 +133,9 @@ foo()
127
133
// Error: Missing parameter
128
134
```
129
135
130
- 上面代码的foo函数 ,如果调用的时候没有参数,就会调用默认值throwIfMissing函数 ,从而抛出一个错误。
136
+ 上面代码的 ` foo ` 函数 ,如果调用的时候没有参数,就会调用默认值 ` throwIfMissing ` 函数 ,从而抛出一个错误。
131
137
132
- 从上面代码还可以看到,参数mustBeProvided的默认值等于throwIfMissing函数的运行结果 (即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。
138
+ 从上面代码还可以看到,参数 ` mustBeProvided ` 的默认值等于 ` throwIfMissing ` 函数的运行结果 (即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。
133
139
134
140
另一个需要注意的地方是,参数默认值所处的作用域,不是全局作用域,而是函数作用域。
135
141
0 commit comments