ES6学习之变量的解构赋值
前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法。->在线ES6转换为ES5工具。
本系列学习随笔参考了阮一峰老师的《ES6标准入门》。
一、解构赋值简述
在学习ES6之前,如果我们要从一个数组将值取出来,我们要如何去做?
let arr=[1,2,3];
let a=arr[0];
let b=arr[1];
let c=arr[2];
是不是感觉上面的代码很繁琐,我们仅仅是从简单的数组结构获取数据就需要很多重复的代码,若是更为复杂的数据结构呢,代码量可能更多,需要遍历的次数也更多。
针对于这种情况,ES6推出了解构赋值,所谓的解构赋值就是允许按照一定模式,从数组和对象中提取值,对变量进行赋值。
二、数组的解构赋值
那我们用ES6的解构赋值可以怎么去优化简述中的例子呢?
let [a, b, c] = [1, 2, 3];//表示可以从数组中提取值,按照对应的位置进行一一赋值。
同样的效果,只需要一行代码,是不是更清晰与简洁。 事实上,只要是具有Iterator 接口的都可以解构成功,关于iterable结构请关注我的博客,后续将会介绍,或者也可以去学习阮一峰老师的《ES6标准入门》的 Iterator一章
针对于更复杂的数组结构,也可以进行解析:
let [a, [[b], c]] = [1, [[2], 3]];//a==1,b==2,c==3
let [a,,c]=[1,2,3]//也可以只要其中几个值a==1,c==3
let [a, ...d] = [1, 2, 3, 4];//可以用...表示这个范围内解构成一个数组,a==1,d==[2,3,4]
let [a,b,c]=[1,2];//若是解构不成功,值为undefined,a==1,b==2,c==undefined
let [a] = 1;//若是右边是不可遍历结构,将会报错。输出Uncaught TypeError: 1 is not iterable;
let [a, b, c] = new Set([1, 2, 3]);Set结构也可以解构成功;
解构赋值中允许指定默认值:
let [a,b,c=3]=[1,2];//a==1,b==2,c==3;
//特别注意的是,当一个数组成员严格等于undefined,默认值才会生效。
let [a,b=2,c]=[1,null,3];//a==1,b==2,c==3;
默认值可以引用解构赋值的其他变量,但该变量必须已经声明。
let [a=1,b=a]=[];//a==1,b==1;
let [a=b, b=1] = []; //Uncaught ReferenceError: b is not defined
三、对象的解构赋值
解构赋值不仅可以在数组中使用,对象中也是可以的,但是对象与数组不同的是,数组是按照顺序排列的,所以在进行对象解构赋值时,属性名与变量一定要一样。
接下来我们看下例子:
let {a,b}={a:1,b:2};//a==1,b==2
//若是想要属性名与变量名不一样,我们也可以写成以下这样
let { a: b } = { a: 1, c: 2 };//b==1,对象的解构赋值是先去寻找相同的属性名再去赋值,但是真正赋值的是后者
在对象中也可以像数组一样进行嵌套赋值
let obj = {
a: [
1,
{ c: 2 }
]
};
let { a: [b, { c }] } = obj;//b==1,c==2
//此时a是不赋值的,若是a想赋值,可以写成这样
let { a, a: [b, { c }] } = obj;//a==[1,{c:2}],b==1,c==2
如果我们要对已经声明的变量进行解构赋值,要小心js引擎将{}解析成代码块:
let a;
{a} = {a: 1};//Uncaught SyntaxError: Unexpected token =
//正确的写法如下:
({a} = {a: 1})
我们也可以有更为复杂的嵌套赋值:
let obj = {};
let arr = [];
({ b: obj.a, c: arr[0] } = { b: 1, c: 2 });//obj=={b:1},arr==[2]
我们可以引申出很多精妙的用法:
//将Math中的log,sin,cos方法逐一赋值出来。用的时候更方便。
let { log, sin, cos } = Math;
//操作数组的结构
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
跟数组一样,我们在对象的解构赋值也可以进行指定默认值
var {a = 1} = {};//a==1
四、字符串的解构赋值
字符串也可以解构赋值:
const [a,b,c,d]=['fish'];//a=='f';b=='i';c=='s';d=='h';
//还可以解构他的属性
const [length:len]=['fish'];//len==5
五、函数参数的解构赋值
函数的参数也能解构赋值
function add([x, y]){
return x + y;
}
add([1, 2]); // 3
上面的例子中,一传入参数就会自动解构赋值成x1 y2
函数参数的解构赋值也能指定默认值
function add({x = 0, y = 0} = {}) {
return x+y;
}
add();//0
add(1);//1
六、用途
解构赋值不单单只能用来纯粹的从对象或者数组里面取值,他还有很多精妙的用途:
let a=1;
let b=2;
[a,b]=[b,a];//此时a==2;b==1;
上面就是一个两个变量交换值的例子,看更加起来简洁清晰易于理解。
平时我们函数如果想返回多个变量怎么办?我门可以将他们先转成数组或者对象,然后再解构赋值:
function getArry(){
return [1,2,3];
}
let [a,b,c]=getArry();//a==1;b==2;c==3
利用解构赋值我们也可以将函数的多个参数一一对应起来;
function a([a,b,c]){};
a([1,2,3]);
//还可以设置函数参数的默认值,上文已提过,这里就不重复说明了。
我们也可以利用解构赋值用来提取json里面的值;
let json={
data:[1,2,3]
}
const [data: num]=json;//num==[1,2,3]
总之,变量的解构赋值是ES6新增的一种使代码更加优美简洁的一种模式,有兴趣的同学可以多去使用学习。
ES6学习之变量的解构赋值的更多相关文章
- ES6 学习笔记 - 变量的解构赋值
变量的解构赋值 学习资料:ECMAScript 6 入门 数组的解构赋值 基本用法 可以从数组中提取值,按照对应位置,对变量赋值.这种写法属于"模式匹配". let [a, b, ...
- ES6学习历程(变量的解构赋值)
一.数组的解构赋值 1.举几个例子足以理解 let [a, b, c] = [1, 2, 3]; a:1; b:2; c:3; let [x, , y] = [1, 2, 3]; x:1 y ...
- ES6学习4 变量的解构赋值
变量的解构赋值 一.数组结构赋值 1.数组结构赋值 let [a, b, c] = [1, 2, 3]; ES6 可以从数组中提取值,按照对应位置,对变量赋值. 1) 本质上,这种写法属于“模式匹配 ...
- JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值
1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...
- ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值
ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...
- ES6 - 基础学习(3): 变量的解构赋值
解构赋值概述 1.解构赋值是对赋值运算符的扩展. 2.它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值. 3.代码书写上显得简洁且易读,语义更加清晰明了:而且还方便获取复杂对象中的数据字 ...
- ES6入门之变量的解构赋值(二)
前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进 ...
- js-ES6学习笔记-变量的解构赋值
1.ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 2.ES6允许写成:let [a,b,c] = [1,2,3];上面代码表示,可以从数 ...
- es6基础入门变量的解构赋值
let [a, b, c] = [1, 2, 3]; let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar baz let [ , , third] = [ ...
随机推荐
- Xcode8.0 / OS X EI Capitan 10.11.6 提交报错90111
改用新系统和新版xcode(都是正式版)后,提交App Store审核时报错: INFO ITMS-90111: "Beta Toolchain. 构建新的 App 和App 更新时,必须使 ...
- 给JavaScript24条最佳实践
作为“30 HTML和CSS最佳实践”的后续,这篇文章将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...
- 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...
- react小知识
概述 有句话说得很好,代码是写给人看的,顺便让机器执行而已.所以我总结了一些写react不太注意的地方,供以后开发时参考,相信对其他人也有用. 组件封装 由于组件其实就是React.createEle ...
- JSP标准标签库:JSTL
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能. jstl出现的目的同el一样也是要代替jsp页面中的脚本代码. ...
- 如何在cygwin中运行crontab定时脚本[利刃篇]
用到cygwin,自然是希望能多处理一些类似linux的任务了,那就自然少不了定时任务crontab,看到网上教程不少,自己运行一个测试却也不那么容易,下面就记录我的安装过程,以供参考吧! 1.首先, ...
- 用node.js做cluster,监听异常的邮件提醒服务
__ __ __ _ __ ____ ____ ____/ /__ _____/ /_ _______/ /____ _____ ___ ____ ___ ____ _(_) / / __ \/ __ ...
- JavaScript的Date类的函数特殊处理导致的问题
记得以前参加校招的时候,总是有日期相关的面试题,比如计算两个日期之间的间隔天数.以前还觉得这种题就是为了纯粹为了面试的,但工作了之后,还就碰到了跟日期相关的bug.下面是一段js代码,是要把字符串描述 ...
- gitlab服务部署及使用
一.什么是gitlib Gitlab 是一个基于Git实现的在线代码仓库托管软件,你可以用Gitlab自己搭建一个类似于Github一样的系统平台,一般搭建gitlab私服就是用在公司的内部 Gitl ...
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...