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 写类方式之四
Jul 05 Javascript
js 创建快捷方式的代码(fso)
Nov 19 Javascript
jQuery实现切换页面布局使用介绍
Oct 09 Javascript
Javascript基础教程之for循环
Jan 18 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
浅谈html转义及防止javascript注入攻击的方法
Dec 04 Javascript
jQuery表格(Table)基本操作实例分析
Mar 10 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
Jun 13 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
Nov 14 Javascript
100行代码实现vue表单校验功能(小白自编)
Nov 19 Javascript
Postman如何实现参数化执行及断言处理
Jul 28 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并发对MYSQL造成压力的解决方法
2013/02/21 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
php中文验证码实现示例分享
2014/01/12 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
网页javascript精华代码集
2007/01/24 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
vue路由跳转传递参数的方式总结
2020/05/10 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python打开文件的方式有哪些
2020/06/29 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
教师自我评价范文
2013/12/16 职场文书
银行优秀员工事迹
2014/02/06 职场文书
什么是就业协议书
2014/04/17 职场文书
户籍证明模板
2014/09/28 职场文书
校运动会广播稿300字
2014/10/07 职场文书
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏