解构赋值

1.概念

ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,该操作即为解构。本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

2.数组解构赋值

1.  用法

  •  先从数组中提取值,再按照对应位置对变量进行赋值。(如下)

        解构赋值笔记_解构赋值

  • 数组结构赋值中,数组的元素是按次序排列的,变量的取值是由它的位置决定,故赋值过程中需要占位(如下)

          解构赋值笔记_解构赋值_02

  •  数组解构赋值中,‘…’用法(将剩下的值全赋给该元素)(如下)

        解构赋值笔记_解构赋值_03

  •  数组解构赋值中,如果解构不成功,变量值就等于undefined.(如下)

        解构赋值笔记_解构赋值_04

  • 数组赋值中,如果没有变量接收的结构值会被忽略掉。(即左边的模式只匹配一部分的等号左边的数组,这种情况称为不完全解构,解构依然成功)
  • 如果赋值不是数组就会报错。(如下)

       解构赋值笔记_解构赋值_05

3.对象解构赋值

1.用法

  • 对象的属性没有次序,变量必须与属性同名才能取到正确的值,也就是说对象的结构赋值的内部机制是先找到同名属性,然后再赋值给对应的变量。(如下)

        解构赋值笔记_解构赋值_06

  •  对象解构赋值中,如果变量名与属性名不一致,必须明确对应关系。(如下)

       解构赋值笔记_解构赋值_07

               (上图中,foo是模式,baz是变量)

  •   对象结构赋值的嵌套(如果解构模式是嵌套的对象,且子对象所在父属性存在,将会报错。)(如下)

           解构赋值笔记_解构赋值_08

  •  如果解构失败,变量的值等于undefined。
  • 如果要将一个已经声明的变量用于结构赋值,需要将解构赋值视为一个表达式,用括号括起来。(如下)

          let x;

         ({ x } = { x: 1 });

  • 由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。(如下)

          解构赋值笔记_解构赋值_09

4.字符串的结构赋值

1.  用法

  • 字符串的解构赋值,将字符串看作一个类似于数组的对象。(如下)

       解构赋值笔记_解构赋值_10

  • 类似数组的对象都有一个length属性,因此还可以对这个属性进行解构。

5.布尔值和数值的结构赋值

1.  用法

  • 如果等号左边是数组或者布尔值,则先转换为对象。(如果等号右边无法转换为对象,则会报错,如null和undefined。)(如下)

       解构赋值笔记_解构赋值_11

6.函数的结构赋值

函数调用时,会将实参传递给形参,其过程就是实参赋值给形参。因此,也可以使用解构赋值。其规则与数组、对象的解构赋值一致,关键看参数是采用哪种解构赋值方式。(用法如下)

       解构赋值笔记_解构赋值_12

7.默认值

解构赋值中允许指定赋值,但如果一个数组成员不严格等于undefined,默认值就不会生效。(null不严格等于undefined,故会报错)(如下)

  •  数组结构默认值

       解构赋值笔记_解构赋值_13

  • 默认值也可以引用解构赋值的其他变量,但是该变量必须声明。(如下)

        解构赋值笔记_解构赋值_14

 

  • 对象解构赋值也指定默认值,且默认值生效条件是对象的属性严格等于undefined。(如下)

      解构赋值笔记_解构赋值_15

  • 函数结构中也指定默认值(如下)

     解构赋值笔记_解构赋值_16

8.解构赋值的优势

  • 便于交换变量的值(如下)

      解构赋值笔记_解构赋值_17

  •  便于函数返回多个值

           函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象中返回,但是运用结构赋值,就可以方便的取出这些值。(如下)

      解构赋值笔记_解构赋值_18

  •  便于函数参数的定义(如下)

     解构赋值笔记_解构赋值_19

  • 便于提取JSON数据
  •  函数参数的默认值
  • 遍历MAP结构
  • 输入模块的指定方法