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 相关文章推荐
jquery tab标签页的制作
May 10 Javascript
读jQuery之六 缓存数据功能介绍
Jun 21 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
jQuery页面刷新(局部、全部)问题分析
Jan 09 Javascript
探究Javascript模板引擎mustache.js使用方法
Jan 26 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
koa-passport实现本地验证的方法示例
Feb 20 Javascript
基于javascript的无缝滚动动画1
Aug 07 Javascript
使用vue构建多页面应用的示例
Oct 22 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
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
php 字符串替换的方法
2012/01/10 PHP
php中socket的用法详解
2014/10/24 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
python解析xml文件实例分析
2015/05/27 Python
python函数形参用法实例分析
2015/08/04 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
python excel转换csv代码实例
2019/08/26 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
将相和教学反思
2014/02/04 职场文书
怎么写好自荐书
2014/03/02 职场文书
三爱活动实施方案
2014/03/19 职场文书
物理课外活动总结
2014/08/27 职场文书
2015年消防工作总结
2015/04/24 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android