关于ES6中的变量的解构赋值的介绍


(文章中介绍的都是个人观点,如有不准确的欢迎指出。但请勿喷,谢谢!)

在了解具体内容之前,我们应该带着以下问题来阅读文章。

什么叫做解构?(简单来讲就是从数组和对象中提取值)

解构赋值可以用在哪些数据结构上?(数组、对象、字符串-类似数组、数值和布尔值-类似对象)

为什么我们要使用它?

它带给我们的好处是什么?

它的应用场景是什么?

什么叫做解构?

结构的分解,ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)

简单来讲就是从数组和对象中提取值。

作用

这是一种将数据结构分解为更小的部分的过程,从而达到简化提取信息的目的。

数组的解构赋值

本质上:写法属于“模式匹配”,只要等号两边的模式相同,即可

基本用法

//以前为变量赋值
let a=1;
let b=2;

//ES6写法
let [a,b,c]=[1,2,3];
//嵌套解构
let [foo,[[bar],baz]]=[1,[[2],3]];

解构过程中,存在一下几种情况

  1. 解构成功(要求:左右的模式一模一样);

  2. 不完全解构(等号左边只匹配了等号右边数组的一部分),通俗的讲就是右边的元素个数要大于左边的;

    //x=1,y=2
    let [x,y]=[1,2,3];  
    //a=1,b=2,d=4
    let [a,[b],d]=[1,[2,3],4];  
  3. 解构不成功(等号左边不能完全匹配),通俗的讲就是右边的元素个数要小于左边的;

    //foo的值为undefined
    let [foo]=[];
  4. 报错(右边不是可遍历的解构,不具备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,默认值就不会生效。

  1. 右边对应元素严格等于undefined,否则不会生效

    //x=undefined
    let [x]=[undefined];
    //x=null
    let [x]=[null];
  2. 默认值可以引用解构赋值的其他变量,但该变量必须已经声明

//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]=[];  
  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")

文章作者: Rabbit
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rabbit !
 上一篇
ES6-Promise对象 ES6-Promise对象
Promise是什么? Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。 从语法上说,Promis
2020-03-25 Rabbit
下一篇 
let、var、const以及块级作用域 let、var、const以及块级作用域
块级作用域ES5 中作用域有:全局作用域、函数作用域。但是没有块作用域的概念。 ES6 中新增了块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。 <script type="text/javas
2020-03-15
  目录