(文章中介绍的都是个人观点,如有不准确的欢迎指出。但请勿喷,谢谢!)
在了解具体内容之前,我们应该带着以下问题来阅读文章。
什么叫做解构?(简单来讲就是从数组和对象中提取值)
解构赋值可以用在哪些数据结构上?(数组、对象、字符串-类似数组、数值和布尔值-类似对象)
为什么我们要使用它?
它带给我们的好处是什么?
它的应用场景是什么?
什么叫做解构?
结构的分解,ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)
简单来讲就是从数组和对象中提取值。
作用
这是一种将数据结构分解为更小的部分的过程,从而达到简化提取信息的目的。
数组的解构赋值
本质上:写法属于“模式匹配”,只要等号两边的模式相同,即可
基本用法
//以前为变量赋值
let a=1;
let b=2;
//ES6写法
let [a,b,c]=[1,2,3];
//嵌套解构
let [foo,[[bar],baz]]=[1,[[2],3]];
解构过程中,存在一下几种情况
解构成功(要求:左右的模式一模一样);
不完全解构(等号左边只匹配了等号右边数组的一部分),通俗的讲就是右边的元素个数要大于左边的;
//x=1,y=2 let [x,y]=[1,2,3]; //a=1,b=2,d=4 let [a,[b],d]=[1,[2,3],4];解构不成功(等号左边不能完全匹配),通俗的讲就是右边的元素个数要小于左边的;
//foo的值为undefined let [foo]=[];报错(右边不是可遍历的解构,不具备Iterator接口)
//以下都会报错
let [foo]=1;
let [foo]=false;
let [foo]=NaN;
let [foo]=undefined;
let [foo]=null;
let [foo]={};
设置默认值
解构赋值允许指定默认值
//foo=true
let [foo = true]=[];
//x=a,y=b
let [x,y='b']=[a];
设置默认值时,应注意一下几种情况
ES6内部使用严格相等运算符(===)判断一个位置是否有值。所以一个数组成员不严格等于undefined,默认值就不会生效。
右边对应元素严格等于undefined,否则不会生效
//x=undefined let [x]=[undefined]; //x=null let [x]=[null];默认值可以引用解构赋值的其他变量,但该变量必须已经声明
//x=1,y=1
let [x=1,y=x]=[];
//x=2,y=2
let [x=1,y=x]=[2];
//x=1,y=2
let [x=1,y=x]=[1,2]
//ReferenceError 因为x用到y时,y还没有声明
let [x=y,y=1]=[];
- 默认值是一个表达式(还没有搞清楚)
对象解构赋值
基本用法
//基本
let {foo,bar}={foo:"aaa",bar:"bbb"};
foo //"aaa"
bar //"bbb"
//没有对应的值
let {baz}={foo:"aaa",bar:"bbb"};
baz //undefined
foo //error:foo is not defined
//变量名与属性名不一致
let {foo:baz} ={foo:"aaa",bar:"bbb"};
//"aaa" 其中foo是属性名 (模式),baz叫变量名
baz
//用于嵌套解构的对象
//p是模式,不是变量(可以这样理解冒号:之前的是模式,用来做匹配用的)
let obj={
p:{
'Hello',
{ y: 'World'}
}
};
let {p:{x,{y}}}=obj;
x //"Hello"
y //"World"
//设置默认值
let {x = 3}={};
x //3
let {x : y=3}={x : 5};
y //5
注意点
1. 与数组的不同
数组的元素是按照次序排列的,变量取值由他的位置决定。
对象中变量必须与属性同名才能取到正确的值
2.内部机制
先找到同名属性,然后再赋值给对应的变量;
真是被赋值的是后者,而不是前者;
3. 默认值生效
对象的属性值严格等于undefined
4. 将一个已经声明的变量用于解构赋值,必须非常小心
let x; {x}={x:1}; //错误
let x; ({x}={x"1}); //正确
字符串的解构赋值
字符串之所以能够解构赋值,其原因是此时的字符串被转换成了一个类似数组的对象;
const [a,b,c]="helllo";
a //"h"
b //"e"
c //"l"
数值和布尔值的解构赋值
解构时,会先转化为对象;
函数参数的解构赋值
function add([x,y]){
return x+y;
};
add([1,2]);
用途
交换变量的值
let x=1;
let y=2;
[x,y]=[y,x];
从函数中返回多个值
//返回一个数组
function example(){
return [1,2,3];
}
let [a,b,c]=example();
//返回一个对象
function example(){
return {
foo:1.
bar:2
};
}
let {foo,bar}=example();
函数参数的定义
可以房间的将一组参数与变量名对应起来
//参数是一组有次序的值
function f([x,y,x]){
//...
}
f([1,2,3]);
//参数是一组无次序的值
function f({x,y,z}){
//....
}
f({x:2,z:3,y:1});
提取JSON数据
对提取JSON对象中的数据尤其有用;
let jsonData={
id:42,
status:"OK",
data:[867,5309]
};
let {id,status,data}=jsonData;
函数参数的默认值
指定参数的默认值,这样就避免了在函数体内部写 var foo=config.foo||"default"这样的语句。
jQuery.ajax=function(url,{
async=true,
cache=true,
//...more config
}){
//...do stuff
}遍历Map解构
var map=new Map();
map.set('first','hello');
mar.set('second','world');
for (let [key,value] of map){
console.log(key+" is "+value);
}
// "first is hello"
// "second is world"
输入模块的指定方法
const {SourceMapConsumer,SourcerNode}=require("source-map")