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的一些特性和用法整理小结
Jan 13 Javascript
jQuery 顺便学习下CSS选择器 奇偶匹配nth-child(even)
May 24 Javascript
JavaScript Array Flatten 与递归使用介绍
Oct 30 Javascript
浅谈Javascript事件模拟
Jun 27 Javascript
查找Oracle高消耗语句的方法
Mar 22 Javascript
js数组与字符串的相互转换方法
Jul 09 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
Oct 16 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
Aug 17 Javascript
React.js绑定this的5种方法(小结)
Jun 05 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
JS实现的排列组合算法示例
Jul 16 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
linux下安装php的memcached客户端
2014/08/03 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
永不消失的title提示代码
2007/02/15 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
2013/04/23 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
javascript+HTML5 Canvas绘制转盘抽奖
2020/05/16 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
Python解析nginx日志文件
2015/05/11 Python
简单的Python调度器Schedule详解
2019/08/30 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Numpy数组的广播机制的实现
2020/11/03 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
餐饮管理自我介绍信
2014/01/15 职场文书
推荐信怎么写
2014/05/09 职场文书
法学院毕业生求职信
2014/06/25 职场文书
护理专科学生自荐书
2014/07/05 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript
SQLServer常见数学函数梳理总结
2022/08/05 MySQL