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 相关文章推荐
关于JavaScript的gzip静态压缩方法
Jan 05 Javascript
循环 vs 递归浅谈
Feb 28 Javascript
jQuery实现用户注册的表单验证示例
Aug 28 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
JS+HTML5实现图片在线预览功能
Jul 22 Javascript
vue单页开发父子组件传值思路详解
May 18 Javascript
vue 组件的封装之基于axios的ajax请求方法
Aug 11 Javascript
Koa代理Http请求的示例代码
Oct 10 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
Feb 12 Javascript
如何根据业务封装自己的功能组件
Apr 19 Javascript
关于JavaScript数组去重的一些理解汇总
Sep 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
优化PHP程序的方法小结
2012/02/23 PHP
php面向对象值单例模式
2016/05/03 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
javascript add event remove event
2008/04/07 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
Python实现Event回调机制的方法
2019/02/13 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
安全生产中长期规划实施方案
2014/02/21 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
毕业论文致谢信
2015/05/14 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python