es6学习笔记(三)变量的解构赋值
1、数组的解构赋值
只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值,和python的解构有相似的地方,但es6要求左右的符号要完全一致。
解构赋值允许指定默认值。
ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效
如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值。
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
解构的时候为什么用默认值呢?
是怕解构的数组没有值的情况下,给它付一个默认值。
2、对象的解构赋值
解构不仅可以用于数组,还可以用于对象。
let { foo, bar } = { foo: "aaa", bar: "bbb" };
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
对象解构赋值类似于python中的dict
如果变量名与属性名不一致,必须写成下面这样:
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
与数组一样,解构也可以用于嵌套结构的对象。
对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。
3、字符冲的解构赋值
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
4、数字和bool值的解构赋值
构赋值时,如果等号右边是数值和布尔值,则会先转为对象
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错
5、函数参数的解构赋值
函数的参数也可以使用解构赋值。
函数参数的解构也可以使用默认值。
6、圆括号的问题
解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。
由此带来的问题是,如果模式中出现圆括号怎么处理。ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。
但是,这条规则实际上不那么容易辨别,处理起来相当麻烦。因此,建议只要有可能,就不要在模式中放置圆括号。
可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
7、解构的用途
交换变量的值
从函数返回多个值
函数参数的定义
提取 JSON 数据
函数参数的默认值
遍历 Map 结构
输入模块的指定方法
浙公网安备 33010602011771号