ES6学习之变量的解构赋值


Posted in Javascript onFebruary 12, 2017

变量的解构赋值

ES6中允许按照一定模式,从数组和对象中提取,对变量进行赋值。

数组的解构赋值

var [a,b,c] = [1,2,3];
a // 1;
b // 2;
c // 3;

上面的代码标示可以从数组中提取值,按照位置的对应关系对变量进行赋值。

本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

let [foo,[[bar],baz]] = [1,[[2],3]];
foo //1;
bar //2;
baz //3;

let [,,third] = ['foo','bar','baz'];
third //'baz'

let [head,...tail] = [1,2,3,4]
head //1;
tail //[2,3,4]

如果解构不成功,变量的值就等于undefined。

let [x,y,z] = ['a']
x // 'a';
y // undefined
z //[]

不完全解构

如果等号左边的模式只匹配等号右边数组的一部分,解构依然可以成功,这种情况叫做不完全解构。

let [x,y] = [1,2,3]
x //1
y //2

如果等号右边不是数组,那么将会报错。(不具备可遍历的结构)。

只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值

function* fibs(){
 var a = 0;
 var b = 1;
 while(true){
  yield a;
  [a,b] = [b,a+b];
 }
}

var [first,second,third,fourth,fifth,sixth] = fibs();
sixth // 5

fibs是一个Generator函数,原生具有Iterator接口,解构赋值会依次从这个接口获取值。

默认值

解构赋值允许指定默认值。

var [foo=true] = [];
foo //true

ES6内部使用严格相等于运算符(===)判断一个位置是否有值。所以,一个数组成员如果不严格等于undefined,默认值便不会生效。

var [x = 1] = [undefined]
x // 1

var [x = 1] = [null]
x // null

表达式也可以作为默认值,如果表达式作为默认值的时候,该表达式是惰性求值的,只有在用到的时候才会求值。

function f(){
 console.log('aaa')
}

let [x = f()] = [1]

在上面的代码中,函数f不会执行,是因为x能取到值。

默认值可以引用解构赋值的其他变量,但该变量必须已经声明。

对象的解构赋值

解构赋值可以应用在数组上,同样也可以用于对象。

var {foo,bar} = {foo:'aaa',bar:'bbb'}
 foo // 'aaa'
 bar // 'bbb'

对象的解构赋值与数组有一个不同点,就是数组的元素是按次序排序的,变量的取值由它的位置决定,而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

var {bar,foo} = {foo:'aaa',bar:'bbb'}
foo //'aaa'
bar //'bbb'


var {baz} = {foo:'aaa',bar:'bbb'}
baz //undefined

如果变量名与属性名不一致,那必须写成这样:

var {foo:baz} = {foo:'aaa'}
baz //'aaa'

实际上对象的解构赋值是以下的形式简写:

var {foo:foo,bar:bar} = {foo:'aaa',bar:'bbb'}

对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量,真正被赋值的是后者,而不是前者。

但是,采取上面的写法时,变量的声明和赋值是一起的,对于let和const而言,变量不能重新声明,所以一旦赋值的变量以前声明过,就会报错。

对象的解构也可以用于嵌套结构的对象。

var obj = {
 p: [
  'hello' ,
  {
   y : 'world'
  }
 ]
}

var {p:[x,{y}]} = obj

x //'hello'
y //'world'

这时p是模式,不是变量,因此不会被赋值。

对象的解构赋值也可以指定默认值,默认值的生效条件是,对象的属性值严格等于undefined。

var {x=3} = {x:undefined}
x //3

var {x=3} = {x:null}
x //null

如果解构模式是嵌套对象,而且子对象所在的父属性不存在,那么将会报错。

var {foo:{bar}} = {baz:'baz'}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用ES6能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
jQuery表格排序组件-tablesorter使用示例
May 26 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
javascript实现window.print()去除页眉页脚
Dec 30 Javascript
JS实现单行文字不间断向上滚动的方法
Jan 29 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
Jul 13 Javascript
js实现固定区域内的不重叠随机圆
Oct 24 Javascript
vue项目,代码提交至码云,iconfont的用法说明
Jul 30 Javascript
原生JavaScript实现购物车
Jan 10 Javascript
AngularJS实现路由实例
Feb 12 #Javascript
jQuery文字轮播特效
Feb 12 #Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 #Javascript
jQuery、zepto、js常用小技巧
Feb 12 #Javascript
JS中如何实现Laravel的route函数详解
Feb 12 #Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 #Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 #Javascript
You might like
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
德劲1107的电路分析与打磨
2021/03/02 无线电
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
python函数缺省值与引用学习笔记分享
2013/02/10 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
Python base64编码解码实例
2015/06/21 Python
Python中的TCP socket写法示例
2018/05/11 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
Easy Spirit官网:美国休闲鞋履中的代表品牌
2019/04/12 全球购物
新大陆软件面试题
2016/11/24 面试题
Ruby如何定义一个类
2012/10/08 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
毕业生就业推荐表自我评价
2015/03/02 职场文书
升职自我推荐信范文
2015/03/25 职场文书
农村党支部承诺书
2015/04/30 职场文书
法律服务所工作总结
2015/08/10 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS