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 Cookie显示用户上次访问的时间和次数
Dec 08 Javascript
可插入图片的TEXT文本框
Dec 27 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
Jan 07 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
jQuery中click事件用法实例
Dec 26 Javascript
javascript按钮禁用和启用的效果实例代码
Oct 29 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
Nov 08 jQuery
vue注册组件的几种方式总结
Mar 08 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
Sep 24 Javascript
详解JavaScript中分解数字的三种方法
Jan 05 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中explode函数用法分析
2014/11/15 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
Python中处理unchecked未捕获异常实例
2015/01/17 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
django 创建过滤器的实例详解
2017/08/14 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
python温度转换华氏温度实现代码
2020/12/06 Python
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
军训感想500字
2014/02/20 职场文书
英语求职信范文
2014/05/23 职场文书
个人年终总结怎么写
2015/03/09 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js