ES6(二) Destructuring-变量的解构赋值
1、解构的含义
允许按照一定的模式,从数组和对象中取值,对变量进行赋值,称为解构。
解构赋值时,只要等号右边的值不是对象,就先将其转换成对象。
本质上,这种写法属于 “模式匹配”,只要两边模式相同,左边的变量就会被赋予对应的值。
let [head,...tail]=[, , , ]; //不完全解构,左边的模式,只匹配一部分的等号右边的数组
解构后: head=1,tail=[2,3,4]。
2、解构的限制。
(1)undefined与null 无法转换成对象,解构赋值就会报错。
let { y } = null; // Cannot match against 'undefined' or 'null'.
(2)如果等号的右边不是数组,转换对象以后不具备 Iterator接口,或本身就不具备Iterator接口,
即某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。
let [foo]=; //undefined is not a function,报错的行数会指向上一行代码
let [foo1,foo2]=new Set(['a', 'b', 'c']);
3、解构赋值时, 左边参数允许默认值。
(1)ES6内部使用严格相对运算符,因此,若defaultValue!==undefined,默认值失效。
var [x=]=[undefined]; //x=1
var [y=]=[null]; //y=2
(2)赋予默认值时,左边参数 可以引用解构赋值的其他变量,但该变量必须已经声明.
let [x1=y1,y1=]=[]; //error,因为此时y1还没有值,应该如此写: let[y=1,x=y]=[];
4、对象解构赋值
对象属性没有次序,变量名必须与属性相同。
let { fishInstance,dogInstance}={
dogInstance: {
name: 'dog',
moveType: 'run'
},
fishInstance{
name:'fish'
}
}
5、变量名与属性名不一致,必须写成下面这样。
真正被赋值的是后者,而不是前者。
let { oldName:newName}={oldName: '', bar: 'barTest'}
6、
let tree = {
root: {
leaf: {
left: ,
right:
}
}
}
var { root:{leaf:{left}} }=tree; //此时, root 与 leaf 都是模式,不会被赋值,只有leaf是变量
console.log(root); /*root is not defined*/
7、对象的解构也可以指定默认值,生效的条件是对象的属性严格等于 undefined
如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,则error。
let {x=}={};
let { foo: { name }}={bar: 'bar'};
将一个已经申明的变量用于解构赋值,必须非常小心。
let temp;
{temp}= {x: }; /error ( { temp }={x: } ); //使用圆括号,避免JS引擎将 "{ }" 解释为代码块
8、字符串解构赋值,会将字符串转换成类似数组的对象。
const [a,b,c,d,e]='hello world';
let { length:strLen }='world';
9、解构 数值和布尔值时,先转换成对象
let { toString:s1 } =; //s1===Number.prototype.toString
let { toString: s2}=true; //s2===Boolean.prototype.toString
解构使用场景
(1)可以很方便的将 现有对象的方法,赋值给某个变量.
let { log: selfLog}=console;
selfLog('test log');
(2)交换变量.
[x,y]=[y,x];
(3)从函数返回多个值
function getPerson() {
return {
name: 'jack',
age:
}
}
var {name,age}=getPerson();
(4) 定义函数参数后,可以不按顺序传入
function setPerson({name,age,address}) {
}
setPerson({age: , address: 'china', name: 'Tom'});
(5)提取JSON对象中的数据
let jsonData = {
age: ,
name: 'Tom',
son: [
'little Jack',
'little Tom'
]
};
let { son:child }=jsonData;
(6)遍历map结构
var map =new Map();
for(let [key,value] of map) { }
for(let [,value] of map ) { }
(7)获取模块的指定方法
const { SourceMapConsumer }= require('');
ES6(二) Destructuring-变量的解构赋值的更多相关文章
- ES6学习之变量的解构赋值
前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.- ...
- ES6学习历程(变量的解构赋值)
一.数组的解构赋值 1.举几个例子足以理解 let [a, b, c] = [1, 2, 3]; a:1; b:2; c:3; let [x, , y] = [1, 2, 3]; x:1 y ...
- ES6学习4 变量的解构赋值
变量的解构赋值 一.数组结构赋值 1.数组结构赋值 let [a, b, c] = [1, 2, 3]; ES6 可以从数组中提取值,按照对应位置,对变量赋值. 1) 本质上,这种写法属于“模式匹配 ...
- ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值
ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...
- ECMAScript 6 入门学习笔记(二)——变量的解构赋值
一.数组的解构赋值 let [foo, [[bar], baz]] = [1, [[2], 3]]; ①可多不可少,等号的右边是数组 let [x, y] = [1, 2, 3]; //可以 let ...
- ES6 学习笔记 - 变量的解构赋值
变量的解构赋值 学习资料:ECMAScript 6 入门 数组的解构赋值 基本用法 可以从数组中提取值,按照对应位置,对变量赋值.这种写法属于"模式匹配". let [a, b, ...
- ES6入门之变量的解构赋值(二)
前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进 ...
- JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值
1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...
- 《ECMAScript 6 入门》【二、变量的解构赋值】(持续更新中……)
前言: 让我们看下es6的新语法解构,跟模式匹配类似.一.数组的解构赋值 举个例子给多个变量赋值的写法: var a =1;var b =2;var c =3; 需要写多个变量特别麻烦,我们先使用以前 ...
- es6基础入门变量的解构赋值
let [a, b, c] = [1, 2, 3]; let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar baz let [ , , third] = [ ...
随机推荐
- ConcurrentHashMap\HashMap put操作时key为什么要rehash
参考java并发编程的艺术一书中,对ConcurrentHashMap的讲解 ConcurrentHashMap使用的是分段锁Segment来保证不同的Segment区域互相不干扰,不存在锁竞争关系, ...
- Codeforces 817F MEX Queries
题意:对一个维护三种操作:1.将[l..r]中的数全部加入集合中.2.将集合中[l..r]范围内的数删去.3.将集合中在[l..r]中的数删去,并将之前不在集合中的数加入集合 考虑到最近线段树总是写爆 ...
- axure扫盲
axure扫盲 zhuyuansj 2017.10.18 20:39* 字数 162 阅读 25评论 2喜欢 3 编辑文章 坐我旁边的前端今天正好初学axure,然后我就顺便学了几招比较基础的,这 ...
- tcpdum使用详解
http://starsliao.blog.163.com/blog/static/89048201062333032563/ TCPdump抓包命令 tcpdump是一个用于截取网络分组,并输出 ...
- Cesium几个案例介绍
前言 本文为大家介绍几个Cesium的Demo,通过这几个Demo能够对如何使用Cesium有进一步的了解,并能充分理解Cesium的强大之处和新功能.其他的无需多言,如果还不太了解什么是Cesium ...
- Java爬虫_资源网站爬取实战
对 http://bestcbooks.com/ 这个网站的书籍进行爬取 (爬取资源分享在结尾) 下面是通过一个URL获得其对应网页源码的方法 传入一个 url 返回其源码 (获得源码后,对源码进 ...
- [睡前灵感and发散思维]由一个简单的数组比较问题而想到的
前言 据说,一只优秀的程序猿往往会有这样的经历,白天遇到一个绞尽脑汁也无法解决的问题,晚上睡了后,半夜在梦中会灵感涌现,立马起床,打开电脑,一气呵成.第二天如果不看注释,完全不知道自己找到了如此巧妙地 ...
- android动画介绍之 自己定义Animation动画实现qq抖一抖效果
昨天我们介绍了Animation的基本使用方法.小伙伴们了解的怎么样了?假设还没有了解过Animation的小伙伴能够看看这篇博客 android动画介绍--Animation 实现loading动画 ...
- windows 怎样查看port占用情况
開始--执行--cmd 进入命令提示符 输入netstat -ano 就可以看到全部连接的PID 之后在任务管理器中找到这个PID所相应的程序假设任务管理器中没有PID这一项,能够在任务管理器中选&q ...
- mysql数据表最高速迁移,mysql的存储引擎为:myisam
本文链接:http://blog.csdn.net/u010670689/article/details/41346689 需求: 开发产品过程中,有个项目分支,数据库须要带数据拷贝,可是表的数据非常 ...