变量的解构赋值
1. 数组解构赋值
2. 对象的解构赋值
3. 字符串的解构赋值
4. 函数参数的解构赋值
5. 用途
数组的解构赋值
基本用法
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。 数组的解构赋值写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
let [a,b,c] = [1,2,3]
a // 1
b // 2
c // 3
如果解构不成功,变量的值就等于undefined。
let [bar,foo] = [1]
foo // foo的值为undefined
另外一种情况是不完全解构,即等号左边的模式,只匹配一部分等号右边的数组,这种情况下解构可以成功
let [a,[b],d] = [1,[2,3],4]
a // 1
b // 2
d // 4
如果等号的左边不是数组,或者严格的说不是可以遍历的结构,那么会报错。
let [foo] = 1
默认值
解构赋值允许指定默认值。
let [foo = true ] = []
foo //true
注意:ES6内部使用严格等于符号,判断一个位置是否有值。所以只有一个数组成员严格等于undefined,默认值才会生效。
let [x= 1] = [null]
x // null 不严格等于undefined 所以x会被赋值等于null
如果默认值是一个表达式,那么这个表达式是惰性求值的,只有当用到的时候,才会去求值。
对象的解构赋值
解构也可以用于对象。 对象的解构和数组有一个重要的不同。数组的元素是按照次序排列的,变量的取值由它的位置决定,而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let {bar,foo} = {foo: 'aaa',bar:'bbb'}
bar // bbb
foo // aaa
let { baz } = {foo: 'aaa',bar:'bbb'}
baz // undefined 找不到同名属性,解构失败 等于undefined
对象的解构赋值,可以很方便的将现有对象的方法,赋值到某个变量。 对象解构赋值的内部机制,是先找到同名属性,然后再赋值给对应的变量。
let { foo:baz } = { foo:'aaa',bar:'bbb'}
baz // bbb
默认值
默认值生效的条件是,对象的属性值严格等于 undefined
字符串解构赋值
字符串也可以解构赋值,此时字符串被转化为一个类似数组的对象。
const [a,b,c,d,e] = 'hello'
a // h
b // e
c // l
d // l
e // o
函数参解构赋值
function add([x,y]){
return x+y
}
add([1,2])
在上面代码中,函数的参数表面上是一个数组,但是在传入参数的一刻,数组参数被解构成变量x和y。对于函数内部来说,能感受到的参数就是x和y。
用途
- 交换变量的值
let x = 1;
let y = 2;
[x,y] = [y,x]
-
从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能把它们放在数组或者对象内返回。有了解构赋值,取出这些值变得非常方便。
-
提取JSON数据
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
- 函数参数的默认值
- 输入模块的某些方法
const { SourceMapConsumer, SourceNode } = require("source-map");