ES6 解构赋值

289 阅读2分钟

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
解构赋值是对赋值运算符的扩展。

1.数组解构

数组的元素是按次序排列的,变量的取值由它的位置决定

let [a,b,c] = [1,2,3]
console.log(a,b,c);  // 1 2 3
// 使用拓展运算符(用在=左边聚合作用,返回一个新数组)只能放在最后面,否则会报错
let [a,b,...c] = [1,2,3,4,5,6]
console.log(a,b,c);   //1 2 [ 3, 4, 5, 6 ]

// 如果解构不成功,变量的值就等于undefined
let [a] = []
console.log(a);   //undefined
let[a,b] = [1]
console.log(a,b);  //1 undefined

// 不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功
let [a,[b],c] = [1,[2,3],4]
console.log(a,b,c);  //1 2 4

// 如果等号右边不是数组(不是可遍历的结构)将会报错
let [a] = 1;   //报错 1 is not iterable
let [a] = false;  //报错 false is not iterable
let [a] = NaN;   //报错 NaN is not iterable
let [a] = undefined;   //报错 undefined is not iterable
let [a] = null;   //报错 null is not iterable
let [a] = {};   //报错  {} is not iterable
//设置默认值
let [a = 1] = []
console.log(a);  //1
2.对象解构

对象的属性没有次序,变量必须与属性同名,才能取到正确的值
如果解构失败,变量的值等于undefined

let {name:name,age:age} = {name:'zhangsan',age:12}
console.log(name,age);  //zhangsan 12
// 当属性名和变量名相同时,可以简写
let {name,age} = {name:'zhangsan',age:12}
console.log(name,age);  //zhangsan 12

// 设置默认值
let {a,b = 3} = {a:1};
console.log(a,b);  //1 3

//解构也可以用于嵌套结构的对象 
let obj = {p:['hello',{y:'world'}]};
//p是模式 不是变量
let {p:[x,{y}]} = obj;
console.log(x,y);  //hello world
3.字符串解构

字符串也可以解构赋值。此时,字符串被转换成了一个类似数组的对象
类似数组的对象都有一个length属性

let [a,b,c,d,e] = 'hello';
console.log(a,b,c,d,e);   //'h' 'e' 'l' 'l' 'o'
let {length:len} = 'hello';
console.log(len);   //5
4.number解构

解构时,如果等号右边是number或者Boolean,则会先转为对象

let {toString:a} = 12;
console.log(a === Number.prototype.toString);  //true
5.boolean解构
let {toString:b} = false;
console.log(b === Boolean.prototype.toString);  //true