ES6 允许按照一定模式从数据和对象中提取值,然后对变量进行赋值,这被称为解构
本质上,解构属于「模式匹配」,只要等号两边的模式相同,左边的变量就会被赋予对应的值
事实上,只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值
ES6 内部使用严格相等运算符(===)判断一个位置是否有值,所以,如果一个数组成员不严格等于 undefined ,默认值是不会生效的
解构不仅可以用于数组,还可以用于对象
对象的解构和数组有一个重要的不同,数组的元素是按次序排列的,变量的取值是由它的位置决定的,而对象的属性没有次序,变量必须与属性同名才能取到正确的值
let obj = {
p: [
'Hello',
{ y: 'World' }
]
}
let { p: [ x, { y } ]} = obj
x // Hello
y // World
此时, p 是模式,不是变量,因此不会被赋值
let obj = {
p: [
'Hello',
{ y: 'World' }
]
}
let { p, p: [ x, { y } ] } = obj
x // Hello
y // World
p // ['Hello', {y: 'World'}]
字符串也可以解构赋值,此时字符串会被转换为一个类似数组的对象
const [a, b, c, d, e] = 'hello'
a // h
b // e
c // l
d // l
e // o
数值和布尔值也可以被解构,在解构赋值时,会将数值和布尔值先转化为对象
let { toString: s } = 123
s === Number.prototype.toString // true
let { toString: s } = true
s === Boolean.prototype.toString // true
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转化为对象。由于 undefined 和 null 无法转化为对象,所以对它们进行解构赋值时会报错