ECMAScript6--解构


Posted in Javascript onMarch 30, 2017

大致介绍

解构:就是将声明的一组变量和与相同结构的数组或者对象的元素数值一一对应,并将变量相对应元素进行赋值

数组解构

例子:

let [a,b,c] = [1,2,3];
 console.log(a); //1
 console.log([a,b,c]); //[1, 2, 3]

可以看到,数组中的a,b,c分别对应1,2,3

嵌套的数组也可以进行解构

let [a,[b,[c]]] = [1,[2,[3]]];
 console.log(c); //3

 let [d,,e] = [1,2,3];
 console.log(e); //3

 let [f,...tail] = [1,2,3];
 console.log(tail); //[2, 3]

在解构不成功时,变量的值就是undefined

let [a,b] = [1];
 console.log(b); //undefined

不完全解构也是可以的

let [a,b,c] = [1,2,3,4];
 console.log(c); //3

也可以设置默认值

let [a = 1] = [];
 console.log(a); //1

 let [b = 1] = [2];
 console.log(b); //2

 let [c = 1] = [undefined];
 console.log(c); //1

 let [d = 1] = [null];
 console.log(d); //null

注意:在ES6中使用严格相等运算符(===)。所以如果默认值不严格相等undefined,默认值就不会生效。例如null

默认值也可以是表达式,但是要注意只有默认值在使用时才会触发函数(惰性求值)

function f(){
  alert(1);
 }
 let [a = f()] = [3]; //f()不会执行
 let [b = f()] = [undefined]; //会执行

对象解构

例子:

let {foo,bar} = {foo:1,bar:2};
 console.log(foo); //1

注意:与数组不同,对象解构时不是根据位置对变量赋值的,而是通过变量名进行赋值,即变量名和属性名必须相等才可以进行赋值,位置不重要

let {bar,foo} = {foo:1,bar:2};
 console.log(foo);//1

如果变量名和属性名不相同,则要采取下面的方法

let {first: f,last: l} = {first:1,last:3};
 console.log(l); //3

意思就是先在对象中查找first属性,如果有就赋值给f,其中first是匹配的模式,而f才是真正的变量

所以对象解构的完整形式是:

let {first: first,last: last} = {first:1,last:3}; 

对象解构也可以进行嵌套

let obj = {
  a:1,
  b:[
   'hello',
   {c:'world'}
  ]
 }
 let {a: a,b: [h,{c:w}]} = obj;
 console.log(a); //1
 console.log(h); //hello
 console.log(w); //world

对象解构也可以设置默认值,并且如果解构失败,变量会赋值undefined

let {x: x = 1,y: y=2,z: z=3,w: w} = {x:3,y:null,z:undefined};
 console.log(x) //3
 console.log(y) //null
 console.log(z) //3
 console.log(w) //undefined

字符串解构

字符串之所以能够解构是因为此时字符串转换成了一个数组

let [a,b,c] = 'hello';
 console.log(a); //h
 console.log(b); //e
 console.log(c); //l

数值和布尔值解构

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象

let {toString: s} = 123;
s === Number.prototype.toString // true

let {toString: a} = true;
a === Boolean.prototype.toString // true

上面代码中,数值和布尔值的包装对象都有tostring属性,因此变量s都能取到值。

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于null和undefined无法转为对象,所以对它们进行解构赋值,都会报错。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
Jquery + Ajax调用webService实例代码(asp.net)
Aug 27 Javascript
ajax异步刷新实现更新数据库
Dec 03 Javascript
JavaScript数组各种常见用法实例分析
Aug 04 Javascript
JS实现超简单的鼠标拖动效果
Nov 02 Javascript
继续学习javascript闭包
Dec 03 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
基于JavaScript实现自定义滚动条
Jan 25 Javascript
vue封装第三方插件并发布到npm的方法
Sep 25 Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 Javascript
vue 组件 全局注册和局部注册的实现
Feb 28 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 Javascript
js图片放大镜效果实现方法详解
Oct 28 #Javascript
js a标签点击事件
Mar 30 #Javascript
JS+html5制作简单音乐播放器
Sep 13 #Javascript
TypeScript入门-接口
Mar 30 #Javascript
如何编写jquery插件
Mar 29 #jQuery
基于JavaScript实现瀑布流效果
Mar 29 #Javascript
Angular动态添加、删除输入框并计算值实例代码
Mar 29 #Javascript
You might like
虫族 Zerg 热键控制
2020/03/14 星际争霸
我的论坛源代码(六)
2006/10/09 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
极简的Python入门指引
2015/04/01 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Python程序慢的重要原因
2020/09/04 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
空乘英文求职信
2014/04/13 职场文书
三好生演讲稿
2014/09/12 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
高考学习决心书
2015/02/04 职场文书
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python