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仿黑客帝国字母掉落效果代码分享
Nov 08 Javascript
JS日期格式化之javascript Date format
Oct 01 Javascript
JS模拟按钮点击功能的方法
Dec 22 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
Jan 13 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
May 31 Javascript
详解为Bootstrap Modal添加拖拽的方法
Jan 05 Javascript
手把手教你写一个微信小程序(推荐)
Oct 17 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
JavaScript Tab菜单实现过程解析
May 13 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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利用str_replace防注入的方法
2013/11/10 PHP
PHP实现的下载远程图片自定义函数分享
2015/01/28 PHP
ThinkPHP安装和设置
2015/07/27 PHP
微信支付扫码支付php版
2016/07/22 PHP
简述php环境搭建与配置
2016/12/05 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
浅谈javascript的调试
2015/01/28 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
vue同个按钮控制展开和折叠同个事件操作
2020/07/29 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
python中__call__内置函数用法实例
2015/06/04 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Python如何实现FTP功能
2020/05/28 Python
python如何保存文本文件
2020/06/07 Python
adidas美国官网:adidas US
2016/09/21 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
团购业务员岗位职责
2014/03/15 职场文书
租房协议书
2014/04/10 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
创先争优一句话承诺
2014/05/29 职场文书
个人委托书范本
2014/09/13 职场文书
采购部2015年度工作总结
2015/07/24 职场文书