参考链接:https://es6.ruanyifeng.com/#docs/destructuring
一、符合Iterator接口类型的结构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
如果解构不成功,变量的值就等于undefined.如果等号的右边不是数组(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。es6中有三类结构生来就具有Iterator接口:数组、类数组对象、Map和Set结构。事实上,只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。【javascript】es6中的遍历器接口Iterator:https://www.cnblogs.com/toulon/p/6403075.html
不可遍历结构解构赋值允许指定默认值。1.只有当一个数组成员严格等于undefined,默认值才会生效。
上面代码中,如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。2.如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
3.默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
上面最后一个表达式之所以会报错,是因为x用y做默认值时,y还没有声明。二、对象的解构赋值
对象,各成员并没有一个确定的顺序,所以遍历时先遍历谁后遍历谁并不确定,所以对象并没有不知Iterator接口。所以对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
解构失败,变量值为undefined1.对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。
2.如果变量名与属性名不一致,必须写成下面这样。
foo是匹配模式,baz才是变量。3.如果对一个已声明的变量进行解构,需要使用()将解构部分的代码包围起来,防止引擎会将{}块作为代码块运行。
三、字符串的解构赋值
1、字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
2、类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
四、数值和布尔型的解构赋值
解构赋值的规则是,只要等号右边不是对象或者数组就先将其转化为对象。
上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。五、函数参数的解构赋值
函数参数的解构也可以使用默认值。
六、作用
1.交换变量值
2.从函数返回多个值
3.函数参数的定义
4.提取JSON数据
5.函数参数默认值
6.遍历Map结构
7.输入模块的指定方式
网友评论