全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

ES6学习之变量的解构赋值

变量的解构赋值

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能带来一定的帮助,如果有疑问大家可以留言交流。


# es6解构赋值  # es6  # 变量解构  # 变量的解构赋值  # ES6数组与对象的解构赋值详解  # ES6 解构赋值的原理及运用  # ES6解构赋值实例详解  # ES6 对象的新功能与解构赋值介绍  # 详解JS ES6变量的解构赋值  # ES6解构赋值的功能与用途实例分析  # ES6的解构赋值实例详解  # ES6中解构赋值的语法及用法实例  # 默认值  # 报错  # 就会  # 将会  # 不完全  # 的是  # 是一个  # 是因为  # 求值  # 才会  # 遍历  # 数据结构  # 不存在  # 然后再  # 这种情况  # 在上面  # 这篇文章  # 用在  # 不具备  # 就等于 


相关文章: 如何在腾讯云服务器快速搭建个人网站?  制作证书网站有哪些,全国城建培训中心证书查询官网?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  建站10G流量真的够用吗?如何应对访问高峰?  如何确认建站备案号应放置的具体位置?  如何彻底卸载建站之星软件?  如何用wdcp快速搭建高效网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作的步骤包括,正确网址格式怎么写?  如何选择可靠的免备案建站服务器?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何快速生成高效建站系统源代码?  如何快速搭建高效WAP手机网站?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  如何快速搭建高效简练网站?  Bpmn 2.0的XML文件怎么画流程图  如何通过可视化优化提升建站效果?  Swift中swift中的switch 语句  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  制作营销网站公司,淘特是干什么用的?  如何快速登录WAP自助建站平台?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何快速建站并高效导出源代码?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  Thinkphp 中 distinct 的用法解析  专业网站建设制作报价,网页设计制作要考什么证?  如何在自有机房高效搭建专业网站?  网站专业制作公司有哪些,做一个公司网站要多少钱?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  b2c电商网站制作流程,b2c水平综合的电商平台?  建站之星伪静态规则如何正确配置?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何做网站制作流程,*游戏网站怎么搭建?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何在云虚拟主机上快速搭建个人网站?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  教学网站制作软件,学习*后期制作的网站有哪些?  如何获取免费开源的自助建站系统源码?  如何用虚拟主机快速搭建网站?详细步骤解析  建站主机SSH密钥生成步骤及常见问题解答?  黑客入侵网站服务器的常见手法有哪些?  如何高效完成自助建站业务培训? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。