ES6笔记(3)-- 解构赋值
系列文章 -- ES6笔记系列
解构赋值,即对某种结构进行解析,然后将解析出来的值赋值给相关的变量,常见的有数组、对象、字符串的解构赋值等
一、数组的解构赋值
function ids() {
return [1, 2, 3];
} var [id1, id2, id3] = ids(); console.log(id1, id2, id3); // 1 2 3
如上,解析返回的数组,取出值并赋给相应的变量,这就是解构赋值
1. 还可以嵌套多层,只要相应的模式匹配了就能解析出来
var [a, [b, [c]]] = [1, [2, [3]]]; a //
b //
c //
2. 如若模式不匹配则报错
var [a, [b, [c]]] = [1, [2, 3]]; // Uncaught TypeError: undefined is not a function a
其实,解构赋值内部的实现方式使用到了ES6的Iterator迭代器,通过层层遍历,保证了相应值的获取
3. 解构不成功,但模式匹配了,相应值为undefined
var [a, b] = [1]; a //
b // undefined
4. 不需要匹配的位置可以置空
var [, b] = [1, 2]; b //
5. 使用...这个扩展运算符,匹配余下的所以值,形成一个数组(匹配不上则为[]),这个符号内部也用到了迭代器Iterator
var [a, ...b] = [1, 2, 3]; a //
b // [2, 3] var [a, ...b] = [1]; a //
b // []
6. 可以设置默认值,当相应的值严格等于undefined时,默认值会生效
var [a, b = [2, 3]] = [1]; a //
b // [2, 3]
var [a, b = [2, 3]] = [1, undefined]; a //
b // [2, 3]
var [a, b = [2, 3]] = [1, null]; a //
b // null
7. 惰性求值,对于默认值中出现函数调用模式的,只有默认值生效,函数才会调用,如下,foo函数将不会被调用
function foo() {
console.log('hit');
} var [str = foo()] = [1]; str //
8. 可以方便的进行变量值的交换
var x = 1,
y = 2; [x, y] = [y, x]; x //
y //
二、对象的解构赋值
与数组类似,对象也可以进行解构赋值
var {name, agee} = {
name: 'jack',
age: 22,
}; name // jack
agee // undefined
如上,对象的解构赋值要求属性名称匹配正确,agee不匹配则变成undefined
1. 不过我们可以自定义属性名称,但要注意的是被赋值的只是我们自定义的属性名称,匹配的模式(项)并未被赋值
var {name, id: ID} = {
name: 'jack',
id: 1
}; ID //
id // Uncaught ReferenceError: id is not defined
更复杂的如
var {
a0: {
b0: {
c0
}
}
} = {
a0: {
b0: {
c0: 'cc',
d0: 'dd'
}
}
}; a0 // Uncaught ReferenceError: a0 is not defined
b0 // Uncaught ReferenceError: b0 is not defined
c0 // cc
2. 类似于数组,也可使用默认值
var {a:b = 2} = {};
b // var {a:b = 2} = {
a: 1
};
b //
3. 因为数组实际上也是个对象,所以
var {0: one, 1: two} = [1, 2]; two //
4. 可以方便地将某个对象上的属性方法一次性提取出来
var {map, slice} = Array.prototype; slice //
const {foo, bar} = require('./util');
5. 非声明时的解构赋值
非声明时,这里是指纯粹的解构赋值,如下代码
var a;
{a} = {
a: 1
}; // Uncaught SyntaxError: Unexpected token = a
以上代码报错了,但某些情况下我们还是需要直接赋值怎么办?
大括号{位于行首,匹配了}之后JS引擎就会认为{a}是一个代码块,所以等号就出问题了,解决方式是在行首放个括号(,即外包裹一层括号()
var a;
({a} = {
a: 1
}); a //
括号的出现,让整个解构赋值的结构被看做一个代码块,而内部的{a}模式则可以正常匹配到
细心的盆友会注意到,右括号换个位置,报错了
var a;
({a}) = {
a: 1
}; // Uncaught SyntaxError: Unexpected token ( a
6. 其实,解构赋值中括号的使用还是有讲究的
1) 不能使用括号的情况
1-1)变量声明语句中,不能带有括号
// 以下代码都会报错 var [(a)] = [1]; var {x: (c)} = {};
var ({x: c}) = {};
var {(x: c)} = {};
var {(x): c} = {}; var { o: ({ p: p }) } = { o: { p: 2 } };
1-2)函数参数中,模式不能带有括号
// 报错
function f([(z)]) {
return z;
} f([1])
1-3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在括号之中
var a;
({a}) = {
a: 1
}; // Uncaught SyntaxError: Unexpected token ( a
2)可以使用括号的情况
可以使用括号的情况很好记,只有一种:赋值语句的非模式部分,可以使用括号
// 都正确
[(b)] = [3];
({ p: (d) } = {});
[(b)] = ([3]);
三、字符串的解构赋值
字符串也可进行解构赋值,因为此时的字符串被转换成了类数组的对象,模式能够匹配起来,如
var [a, b] = 'str';
a // s
b // t var {0:a, 1:b, length:len} = 'str';
a // s
b // t
len //
四、其他类型的解构赋值
1. 解构赋值的规则是,只要等号右边的值不是对象,就先尝试将其转为对象。如果转换之后的对象或原对象拥有Iterator接口,则可以进行解构赋值,否则会报错。
var {toString: s} = 1;
s // var {toString: s} = true;
s //
以上的数组和布尔值会转换成对象,toString模式匹配上了对象的toString属性,所以解构成功,而null或undefined却不能转换成此类对象,所以报错
var {toString: s} = null;
s // Uncaught TypeError: Cannot match against 'undefined' or 'null'.
ES6引入了Iterator迭代器,集合Set或Generator生成器函数等都部署了这个Iterator接口,所以也可以用来进行解构赋值
2. 比如Set的解构赋值
var [a, b, c] = new Set([1, 2, 3]); a //
b //
c //
3. 函数参数的解构赋值
function calc([a, b, c = 10]) {
console.log(a + b + c); //
} calc([1, 2]);
ES6笔记(3)-- 解构赋值的更多相关文章
- ES6 - 变量的解构赋值学习笔记
变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...
- es6变量的解构赋值学习笔记
1. 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象.由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错. let { prop: x } = undefin ...
- ES6学习笔记之解构赋值
1.数组的解构赋值 简单用法 { // 旧 let a=1,b=3; //新 let [a,b]=[1,3]; console.log(a,b);// 1 3 } 只要等号两边的模式相同,左边的变量就 ...
- ES6学习之 解构赋值
最近看了一个vue的项目,发现作者大量使用了ES6的语法,包括async, Promise, Set, Map还有一些解构赋值, 才发现自己对于ES6的语法缺乏了总结和运用,看得有点艰难,所以重新学习 ...
- ES6 - Note2:解构赋值
ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...
- ES6 变量的解构赋值
数组的解构赋值 var [a,b,c] = [1,2,3]; 左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...
- ES6-个人学习笔记二--解构赋值
第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或 ...
- ES6的变量解构赋值
前 言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...
- 关于ES6 的对象解构赋值
之 前写了关于ES6数组的解构 现在 go on ; 解构不仅可以用于数组,还可以用于对象: 对象的解构和数组有一个重要的不同.数组的元素是按次序排列的,变量的取值是由他的位置决定的:而对象的属性没有 ...
- ES6中的解构赋值
在解释什么是解构赋值前,我们先来看一下, ES5 中对变量的声明和赋值. var str = 'hello word'; 左边一个变量名,右边可以是字符串,数组或对象. ES6 中增加了一种更为便捷的 ...
随机推荐
- [翻译]理解Ruby中的blocks,Procs和lambda
原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...
- ListView设置headerview和footerview
[简介]headerview就是通常看到的那种listview手势下滑露出上面的部分,下拉到一定位置,松手会开始请求网络数据,然后刷新listview的列表.footerview一般就是listvie ...
- STSdb,最强纯C#开源NoSQL和虚拟文件系统 4.0 RC2 支持C/S架构
STSdb是什么 再来说明一下STSdb是什么:STSdb是C#写的开源嵌入式数据库和虚拟文件系统,支持实时索引,性能是同类产品的几倍到几十倍,访问官方网站. 温故知新 之前发了文章<STSdb ...
- Java枚举类型getClass和getDeclaringClass区别(未完待续)
Java中的枚举类型有getClass()和getDeclaringClass()两个方法,在通常情况下这两个方法返回的类型一样,在某些场景下会有不同的表现 参照 http://stackoverfl ...
- IOS UIView 02- 深入理解 Scroll Views
注:本人是翻译过来,并且加上本人的一点见解. 前言 可能你很难相信 UIScrollView 和一个标准的 UIView 差异并不大,scroll view 确实会多出一些方法,但这些方法只是和 UI ...
- 这里有个坑---js日期格式yyyy-MM-dd与yyyy/MM/dd
这里有个坑,---------每一个遇到的坑总结后都是一比财富. 我们写脚本的时候,一般定义一个日期格式会使用“2015-12-21”和“2015/12/21”两种数据格式,由于各取所需日期格式并没有 ...
- 基础才是重中之重~方法override详解
回到 目录 之所以写这篇文章,完全是因为这次代码审核,这次代码审核过程当中,出现了很多我认为基础知识不够扎实的问题,所以,打算把它们记录下来,共大家分享. 方法的override,即方法的覆写或者重写 ...
- Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结
Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结 分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据 ...
- Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
Atitti 图像处理 图像混合 图像叠加 blend 原理与实现 混合模式 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 混合模式是图像处理技术中的一个技术名词,不 ...
- 好友录v1.2.7_Build(7790)
<好友录>是使用.net Framework4.0+sqlite开发的,属于WingKu(谷毅科技)系列软件之一.它是一款外观时尚.美观,操作简单.易用,功能强大的个人通讯信息管理软件.它 ...