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 相关文章推荐
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
Jan 22 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
ie8模式下click无反应点击option无反应的解决方法
Oct 11 Javascript
JQuery工具函数汇总
Jun 15 Javascript
RequireJS使用注意细节
May 15 Javascript
jquery实现的table排序功能示例
Mar 10 Javascript
Javascript操作dom对象之select全面解析
Apr 24 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
Nov 14 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 Javascript
js实现复制粘贴的两种方法
Dec 04 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
Prototype Array对象 学习
2009/07/19 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
js控制input输入字符解析
2013/12/27 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
JavaScript设计模型Iterator实例解析
2020/01/22 Javascript
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
使用python绘制温度变化雷达图
2019/10/18 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
python链表类中获取元素实例方法
2021/02/23 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
幼师专业毕业生自荐信
2013/09/29 职场文书
出纳的岗位职责
2013/11/09 职场文书
考试退步检讨书
2014/01/15 职场文书
简单的辞职信范文
2014/01/18 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
Python if else条件语句形式详解
2022/03/24 Python