@@ -168,27 +168,51 @@ let [x = y, y = 1] = []; // ReferenceError: y is not defined
168
168
169
169
## 对象的解构赋值
170
170
171
+ ### 简介
172
+
171
173
解构不仅可以用于数组,还可以用于对象。
172
174
173
175
``` javascript
174
- let { foo, bar } = { foo: " aaa" , bar: " bbb" };
176
+ let { foo, bar } = { foo: ' aaa' , bar: ' bbb' };
175
177
foo // "aaa"
176
178
bar // "bbb"
177
179
```
178
180
179
181
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
180
182
181
183
``` javascript
182
- let { bar, foo } = { foo: " aaa" , bar: " bbb" };
184
+ let { bar, foo } = { foo: ' aaa' , bar: ' bbb' };
183
185
foo // "aaa"
184
186
bar // "bbb"
185
187
186
- let { baz } = { foo: " aaa" , bar: " bbb" };
188
+ let { baz } = { foo: ' aaa' , bar: ' bbb' };
187
189
baz // undefined
188
190
```
189
191
190
192
上面代码的第一个例子,等号左边的两个变量的次序,与等号右边两个同名属性的次序不一致,但是对取值完全没有影响。第二个例子的变量没有对应的同名属性,导致取不到值,最后等于` undefined ` 。
191
193
194
+ 如果解构失败,变量的值等于` undefined ` 。
195
+
196
+ ``` javascript
197
+ let {foo} = {bar: ' baz' };
198
+ foo // undefined
199
+ ```
200
+
201
+ 上面代码中,等号右边的对象没有` foo ` 属性,所以变量` foo ` 取不到值,所以等于` undefined ` 。
202
+
203
+ 对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。
204
+
205
+ ``` javascript
206
+ // 例一
207
+ let { log, sin, cos } = Math ;
208
+
209
+ // 例二
210
+ const { log } = console ;
211
+ log (' hello' ) // hello
212
+ ```
213
+
214
+ 上面代码的例一将` Math ` 对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。例二将` console.log ` 赋值到` log ` 变量。
215
+
192
216
如果变量名与属性名不一致,必须写成下面这样。
193
217
194
218
``` javascript
@@ -204,13 +228,13 @@ l // 'world'
204
228
这实际上说明,对象的解构赋值是下面形式的简写(参见《对象的扩展》一章)。
205
229
206
230
``` javascript
207
- let { foo: foo, bar: bar } = { foo: " aaa" , bar: " bbb" };
231
+ let { foo: foo, bar: bar } = { foo: ' aaa' , bar: ' bbb' };
208
232
```
209
233
210
234
也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
211
235
212
236
``` javascript
213
- let { foo: baz } = { foo: " aaa" , bar: " bbb" };
237
+ let { foo: baz } = { foo: ' aaa' , bar: ' bbb' };
214
238
baz // "aaa"
215
239
foo // error: foo is not defined
216
240
```
@@ -280,6 +304,30 @@ obj // {prop:123}
280
304
arr // [true]
281
305
```
282
306
307
+ 如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。
308
+
309
+ ``` javascript
310
+ // 报错
311
+ let {foo: {bar}} = {baz: ' baz' };
312
+ ```
313
+
314
+ 上面代码中,等号左边对象的` foo ` 属性,对应一个子对象。该子对象的` bar ` 属性,解构时会报错。原因很简单,因为` foo ` 这时等于` undefined ` ,再取子属性就会报错。
315
+
316
+ 注意,对象的解构赋值可以取到继承的属性。
317
+
318
+ ``` javascript
319
+ const obj1 = {};
320
+ const obj2 = { foo: ' bar' };
321
+ Object .setPrototypeOf (obj1, obj2);
322
+
323
+ const { foo } = obj1;
324
+ foo // "bar"
325
+ ```
326
+
327
+ 上面代码中,对象` obj1 ` 的原型对象是` obj2 ` 。` foo ` 属性不是` obj1 ` 自身的属性,而是继承自` obj2 ` 的属性,解构赋值可以取到这个属性。
328
+
329
+ ### 默认值
330
+
283
331
对象的解构也可以指定默认值。
284
332
285
333
``` javascript
@@ -312,28 +360,9 @@ x // null
312
360
313
361
上面代码中,属性` x ` 等于` null ` ,因为` null ` 与` undefined ` 不严格相等,所以是个有效的赋值,导致默认值` 3 ` 不会生效。
314
362
315
- 如果解构失败,变量的值等于 ` undefined ` 。
363
+ ### 注意点
316
364
317
- ``` javascript
318
- let {foo} = {bar: ' baz' };
319
- foo // undefined
320
- ```
321
-
322
- 如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。
323
-
324
- ``` javascript
325
- // 报错
326
- let {foo: {bar}} = {baz: ' baz' };
327
- ```
328
-
329
- 上面代码中,等号左边对象的` foo ` 属性,对应一个子对象。该子对象的` bar ` 属性,解构时会报错。原因很简单,因为` foo ` 这时等于` undefined ` ,再取子属性就会报错,请看下面的代码。
330
-
331
- ``` javascript
332
- let _tmp = {baz: ' baz' };
333
- _tmp .foo .bar // 报错
334
- ```
335
-
336
- 如果要将一个已经声明的变量用于解构赋值,必须非常小心。
365
+ (1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。
337
366
338
367
``` javascript
339
368
// 错误的写法
@@ -352,7 +381,7 @@ let x;
352
381
353
382
上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。关于圆括号与解构赋值的关系,参见下文。
354
383
355
- 解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。
384
+ (2) 解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。
356
385
357
386
``` javascript
358
387
({} = [true , false ]);
@@ -362,15 +391,7 @@ let x;
362
391
363
392
上面的表达式虽然毫无意义,但是语法是合法的,可以执行。
364
393
365
- 对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。
366
-
367
- ``` javascript
368
- let { log, sin, cos } = Math ;
369
- ```
370
-
371
- 上面代码将` Math ` 对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。
372
-
373
- 由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
394
+ (3)由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
374
395
375
396
``` javascript
376
397
let arr = [1 , 2 , 3 ];
0 commit comments