@@ -200,7 +200,7 @@ baz // undefined
200200如果变量名与属性名不一致,必须写成下面这样。
201201
202202``` javascript
203- var { foo: baz } = { foo: " aaa" , bar: " bbb" };
203+ var { foo: baz } = { foo: ' aaa' , bar: ' bbb' };
204204baz // "aaa"
205205
206206let obj = { first: ' hello' , last: ' world' };
@@ -225,7 +225,7 @@ foo // error: foo is not defined
225225
226226上面代码中,真正被赋值的是变量` baz ` ,而不是模式` foo ` 。
227227
228- 注意,采用这种写法时,变量的声明和赋值是一体的。对于let和const来说 ,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。
228+ 注意,采用这种写法时,变量的声明和赋值是一体的。对于 ` let ` 和 ` const ` 来说 ,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。
229229
230230``` javascript
231231let foo;
@@ -235,7 +235,7 @@ let baz;
235235let {bar: baz} = {bar: 1 }; // SyntaxError: Duplicate declaration "baz"
236236```
237237
238- 上面代码中,解构赋值的变量都会重新声明,所以报错了。不过,因为` var ` 命令允许重新声明,所以这个错误只会在使用` let ` 和` const ` 命令时出现。如果没有第二个let命令 ,上面的代码就不会报错。
238+ 上面代码中,解构赋值的变量都会重新声明,所以报错了。不过,因为` var ` 命令允许重新声明,所以这个错误只会在使用` let ` 和` const ` 命令时出现。如果没有第二个 ` let ` 命令 ,上面的代码就不会报错。
239239
240240``` javascript
241241let foo;
@@ -245,13 +245,15 @@ let baz;
245245({bar: baz} = {bar: 1 }); // 成功
246246```
247247
248+ 上面代码中,` let ` 命令下面一行的圆括号是必须的,否则会报错。因为解析器会将起首的大括号,理解成一个代码块,而不是赋值语句。
249+
248250和数组一样,解构也可以用于嵌套结构的对象。
249251
250252``` javascript
251253var obj = {
252254 p: [
253- " Hello" ,
254- { y: " World" }
255+ ' Hello' ,
256+ { y: ' World' }
255257 ]
256258};
257259
@@ -302,7 +304,13 @@ var {x, y = 5} = {x: 1};
302304x // 1
303305y // 5
304306
305- var { message: msg = " Something went wrong" } = {};
307+ var {x: y = 3 } = {};
308+ y // 3
309+
310+ var {x: y = 3 } = {x: 5 };
311+ y // 5
312+
313+ var { message: msg = ' Something went wrong' } = {};
306314msg // "Something went wrong"
307315```
308316
@@ -343,7 +351,6 @@ _tmp.foo.bar // 报错
343351
344352``` javascript
345353// 错误的写法
346-
347354var x;
348355{x} = {x: 1 };
349356// SyntaxError: syntax error
@@ -376,6 +383,17 @@ let { log, sin, cos } = Math;
376383
377384上面代码将` Math ` 对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。
378385
386+ 由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。
387+
388+ ``` javascript
389+ var arr = [1 , 2 , 3 ];
390+ var {0 : first, [arr .length - 1 ] : last} = arr;
391+ first // 1
392+ last // 3
393+ ```
394+
395+ 上面代码对数组进行对象结构。数组` arr ` 的` 0 ` 键对应的值是` 1 ` ,` [arr.length - 1] ` 就是` 2 ` 键,对应的值是` 3 ` 。方括号这种写法,属于“属性名表达式”,参见《对象的扩展》一章。
396+
379397## 字符串的解构赋值
380398
381399字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
@@ -551,7 +569,7 @@ function f([(z)]) { return z; }
551569[x, y] = [y, x];
552570```
553571
554- 上面代码交换变量x和y的值 ,这样的写法不仅简洁,而且易读,语义非常清晰。
572+ 上面代码交换变量 ` x ` 和 ` y ` 的值 ,这样的写法不仅简洁,而且易读,语义非常清晰。
555573
556574** (2)从函数返回多个值**
557575
@@ -612,7 +630,6 @@ console.log(id, status, number);
612630** (5)函数参数的默认值**
613631
614632``` javascript
615-
616633jQuery .ajax = function (url , {
617634 async = true ,
618635 beforeSend = function () {},
@@ -624,7 +641,6 @@ jQuery.ajax = function (url, {
624641}) {
625642 // ... do stuff
626643};
627-
628644```
629645
630646指定参数的默认值,就避免了在函数体内部再写` var foo = config.foo || 'default foo'; ` 这样的语句。
@@ -664,7 +680,5 @@ for (let [,value] of map) {
664680加载模块时,往往需要指定输入那些方法。解构赋值使得输入语句非常清晰。
665681
666682``` javascript
667-
668683const { SourceMapConsumer , SourceNode } = require (" source-map" );
669-
670684```
0 commit comments