解构赋值
解构赋值
数组的解构赋值
-
只要等号两边的模式相同,左边的变量就会被赋予对应的值
let [x, y, z] = [1, 2, 3]
let [a, [[b], c]] = [1, [[2] ,3]] -
如果解构不成功,变量的值就为
undefined
-
等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。称为不完全解构
let [a, b] = [1, 2, 3]
a//1
b//2 -
如果等号右边的不是数组,将会报错
-
只要某种数据结构具有Iterator接口,都可以采用数组形式的解构
默认值
-
允许指定默认值
let [foo = true] = []//foo:true
let [a, b = 2] = [1]//a:1,b:2
let [a, b = a] = [1, undefined]//a:1,b:1 -
只有当一个数组成员严格等于
undefined
,默认值才会生效let [x = 1] = [null]
//此时x等于null -
如果默认值是一个表达式,则此表达式是惰性求值的
function f(){
return 1;
}
let [x = f()] = [2]//x:2 不会执行函数f
对象的解构赋值
-
因为对象的属性没有次序,所以变量必须与属性同名,才能取到正确的值
let {foo, message} = {foo: '111', message: 222};
let {ashen, xing} = {xing: 23, ashen: 20}; -
如果解构失败,变量的值等于
undefined
-
对象的解构赋值可以取到继承的属性
const obj1 = {};
const obj2 = { foo : 'bar' };
Object.setPrototypeOf(obj1,obj2);
const { foo } = obj1;
//此时虽然obj1没有foo属性,但其原型对象是obj2,继承了其属性,所以解构赋值成功
注意
-
在将一个已经声明了的变量进行解构赋值时,大括号不能写在行首,否则会被js解析成块级作用域,出现语法错误
-
应该用
()
将解构赋值包裹起来
let x;
{x} = {x:1} //报错
({x} = {x:1}) //不报错 -
-
解构赋值允许等号左边的模式中不放置任何变量名,虽然无意义,但合法。
-
由于数组本质是特殊的对象,隐藏可以对数组进行对象属性的解构
let arr = [1, 2, 3]
let { 0 : first, [arr.length - 1] : last} = arr
//键值为0的值是1,first:1
//键值为2的值为3,last:3
数值和布尔值的解构赋值
-
如果等号右边不是数组或对象,则会先转换为对象
let {toString: s} = 123;
//123转为对象后:Number 具有toString方法,所以s为true
let {toString: s} = true;
//true转为对象后:Boolean 具有toString方法,所以s为true -
由于
undefined
和null
无法转换为对象,所以解构赋值报错