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 相关文章推荐
对于this和$(this)的个人理解
Sep 08 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
Seajs的学习笔记
Mar 04 Javascript
JavaScript对象之深度克隆介绍
Dec 08 Javascript
angular.foreach 循环方法使用指南
Jan 06 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
Jan 27 Javascript
利用transition实现文字上下抖动的效果
Jan 21 Javascript
angular学习之ngRoute路由机制
Apr 12 Javascript
weex里Vuex state使用storage持久化详解
Sep 09 Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
layui实现文件或图片上传记录
Aug 28 Javascript
angular4中引入echarts的方法示例
Jan 29 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
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
php上传大文件失败的原因及应对策略
2015/10/20 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
js实现横向拖拽导航条功能
2017/02/17 Javascript
浅析前端路由简介以及vue-router实现原理
2018/06/01 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python爬取网易云音乐评论
2018/11/16 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
html5与css3小应用
2013/04/03 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
项目建议书格式
2014/03/12 职场文书
网站创业计划书
2014/04/30 职场文书
学校标语大全
2014/06/19 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
Golang的继承模拟实例
2021/06/30 Golang
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python
教你如何用cmd快速登录服务器
2022/06/10 Servers