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 相关文章推荐
JS拖动技术 关于setCapture使用
Dec 09 Javascript
各情景下元素宽高的获取实现代码
Sep 13 Javascript
统计jQuery中各字符串出现次数的工具
May 03 Javascript
JavaScript实现Iterator模式实例分析
Jun 09 Javascript
javascript执行环境及作用域详解
May 05 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
vue.js单页面应用实例的简单实现
Apr 10 Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 Javascript
three.js 入门案例详解
Jan 23 Javascript
Vue.set()实现数据动态响应的方法
Feb 07 Javascript
swiper Scrollbar滚动条组件详解
Sep 08 Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 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
PHP sprintf()函数用例解析
2011/05/18 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
php实现购物车功能(下)
2016/01/05 PHP
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
jQuery实现下拉框多选 jquery-multiselect 的实例代码
2016/07/14 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
js实现div色块碰撞
2020/01/16 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python while 循环使用的简单实例
2016/06/08 Python
python3中函数参数的四种简单用法
2018/07/09 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
党员年终民主评议的自我评价
2013/11/05 职场文书
考试违纪检讨书
2014/02/02 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
感谢信格式范文
2015/01/22 职场文书
2016新年慰问信范文
2015/03/25 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python