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 性能优化手册 推荐
Feb 23 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
js有序数组的连接问题
Oct 01 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
Oct 14 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
详解Angular2中的编程对象Observable
Sep 17 Javascript
微信小程序tabbar不显示解决办法
Jun 08 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
Nov 01 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
Jun 11 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
2012/10/29 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
JSQL  一个 web DB 的封装
2010/05/05 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
浅谈js的异步执行
2016/10/18 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
详解Vue之计算属性
2020/06/20 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
python开发一款翻译工具
2020/10/10 Python
python中操作文件的模块的方法总结
2021/02/04 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
动态密码技术
2012/10/18 面试题
护士辞职信范文
2014/01/19 职场文书
卖车协议书范文
2016/03/23 职场文书
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers
Redis主从复制操作和配置详情
2022/09/23 Redis