数组的解构赋值
在ES6中允许按照一定的模式,从数组或对象中提取值,对变量进行赋值,这种方式称为解构(Destructuring)。在ES5中,我们是这样为变量赋值的
而在ES6中,我们可以这样为变量赋值
本质上,这种方式属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值,同时也可以嵌套。
如果解构不成功,变量的值就为undefined
,如果等号右边不是数组(严格说是不可遍历的解构),就会报错。
默认值
解构赋值允许指定默认值
注意,ES6中使用严格相等运算符(===
),判断一个位置是不是有值,如果一个数组成员不是严格等于undefined
,默认值就不会生效,例如上面的null
不严格等于undefined
,默认值就不会生效。
对象的解构赋值
解构赋值不仅可以用于数组,也可以用于对象,这个时候有两种情况:
变量与属性同名
|
|
变量与属性不同名
如果变量名与属性名不一样,必须写成下面这样
这其实说明,对象的解构赋值是下面形式的简写
也就是说,对象的解构赋值的内部机制,是先找到同名的属性,然后再赋值给对应的变量。真正被赋值的是后者,而不是前者。
上面代码中,真正被赋值的是变量n
而不是模式name
。
默认值
对象的解构赋值也可以指定默认值,默认值生效的条件是属性的值严格等于undefined
。
字符串的解构赋值
字符串也可以解构赋值,此时,字符串被转换成了一个类似数组的对象。
类似数组的对象都有一个length
属性,因此还可以对这个属性解构赋值。
函数参数的解构赋值
函数的参数也可以使用解构赋值
上面的代码中,函数add
的参数是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x
和y
,对于函数内部代码来说,他们能感受到的参数就是x
和y
。
函数的参数也可以使用默认值
上面代码中,函数add
的参数是一个对象,x
和y
通过这个对象解构赋值,如果解构失败,x
和y
使用默认值。
注意,下面的写法会得到不一样的结果。
上面的代码是为函数add
的参数指定默认值,而不是为变量x
和y
指定默认值,所以会得到和上面不同的结果。
用途
交换变量的值
|
|
从函数返回多个值
函数只能返回一个值,如果要返回多个值,就需要放到数组或对象中返回,有了结构赋值,取出这些返回值就简单多了。
函数参数的定义
解构赋值可以方便的将一组参数与变量名对应起来。
提取JSON数据
解构赋值提取JSON中的数据非常有用。
函数参数的默认值
指定参数的默认值,就避免了在函数体内再写var foo = config.foo || 'default config';
这样的判断语句。
遍历Map结构
任何部署了Iterator接口的对象都可以使用for...of
循环遍历,Map结构原生支持Iterator接口,配合解构赋值,获取键名和键值就非常方便。
输入模块的指定方法
加载模块时,往往需要指定加载模块的哪些方法,使用解构赋值使得输入非常清晰。