ES6语法学习
let和const命令
let和const命令
注意:es6规定,var命令和function命令声明的全局变量,依旧是全局对象的属性;另一方面规定,let命令,const命令,class命令声明的全局变量,不属于全局对象的属性。也就是说,从ES6开始,全局变量将逐步与全局对象的属性脱钩。
变量的解构赋值
数组的解构赋值
- 结构赋值本质上属于模式比配,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
- 结构赋值允许指定默认的值。
- 只要某种数据结构具有Iterator接口,度可以采用数组形式的解构赋值。
对象的解构赋值
- 对象的解构赋值与数组有一个重要的不同。数据的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取得正确的值。
- 对象的解构赋值内部机制,是先找到同名属性,然后再赋值给对应的变量。真正被赋值的是后者,而不是前者。
字符串的解构赋值
- 字符串也可以结构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
数值和布尔值的解构赋值
- 解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
- 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。由于undefined和null无法转为对象,所以对他们进行解构赋值,都会报错.
函数参数的解构赋值
圆括号问题
解构赋值虽然很方便,但是解析起来并不容易。对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。
由此带来的问题是,如果模式中出现圆括号怎么处理。ES6的规则是,只要有可能导致解构的歧义,就不得使用圆括号。
但是,这条规则实际上不那么容易辨别,处理起来相当麻烦。因此,建议只要有可能,就不要在模式中放置圆括号。
不能使用圆括号的情况
- 变量声明语句中不能带有圆括号.
- 函数参数中,模式不能带有圆括号.
- 赋值语句中,不能讲整个模式,或嵌套模式中的一层,放在圆括号之中.
可以使用圆括号的情况
- 可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
用途
- 交换变量的值
- 从函数返回多个值。
- 函数参数的定义
- 提取json数据
- 函数参数的默认值。
- 遍历Map结构
- 输入模块的指定方法
字符串的扩展
- 字符的Unicode表示法。
- codePointAt(),能够正确处理4个字节存储的字符,返回一个字符的码点。
- String.fromCodePoint()用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符
注意:fromCodePoint方法定义在String对象上,而codePointAt方法定义在字符串的实例对象上。 - 字符串的遍历器接口,使得字符串可以被for…of循环遍历。
- at()字符串实例的at方法,可以识别Unicode编号大于)0xFFFF的字符,返回正确的字符。
- normalize(),将字符的不同表示方法统一为同样的形式,这称为Unicode的正规化.不过,normalize方法目前不能识别三个火三个以上字符的合成。这种情况下,还是只能用正则表达式,通过Unicode编号区间来判断。
- includes(),startsWith(),endsWith()
- repeat()方法返回一个新字符串,表示将原字符串重复n次。
- padStart(),padEnd()ES7推出了字符串不全长度的功能。如果某个字符串不能指定长度,会在头部和尾部不全。padStart用于头部补全,padEnd用于尾部补全。
- 模板字符串,是增强版的字符串,用反引号标识。它可以当作普通字符串使用,也可以使用定义多行字符串,或者在字符串中嵌入变量。
- 标签模板,模板字符串可以紧跟在一个函数名后面吗,该函数将被调用来处理这个模板字符串。这被称为标签模板功能。
- String.raw()ES6还为原生的String对象,提供了一个raw方法。用来充当模板字符串的处理函数,返回一个斜杠都被转义的字符串,对应于替换变量后的模板字符串。
正则的扩展
- RegExp构造函数,如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
- 字符串的正则表达式,字符串对象共有4个方法,可以使用正则表达式:match(),replace(),search()和split()。ES6将这4个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全部定义在RegExp对象上。
- U修饰符ES6对正则表达式添加了u修饰符,含义为Unicode模式,用来正确处理大于\uFFFF的Unicode字符。也就是说,会正确处理四个字节的UTF-16编码。
- ES6新增了y修饰符,叫做粘连sticky修饰符y修饰符的作用与g修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的涵义。
- sticky属性,与y修饰符相匹配,ES6的正则对象多了sticky属性,表示是否设置了y修饰符。
ES6为表达式新增了flags属性,会返回正则表达式的修饰符。 - RegExp.escape()
数值的扩展
- 二进制和八进制表示法,ES6提供了二进制和八进制数值的新的写法,分别用前缀0B或0b和0o或0O
- ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法。Number.isFinite()用来检查一个数值是否为有限的(finite)。Number.isNaN()用来检查一个值是否为NaN。
- ES6将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。
- Number.isInteger()用来判断一个值是否为整数。需要注意的是,在JavaScript内部,整数和浮点数是同样的储存方法,所以3和3.0被视为同一个值。
- ES6在Number对象上面,新增一个极小的常量Number.EPSILON。实现误差检测机制。
- Number.isSafeInteger()则是用来判断一个整数是否落在这个范围之内。
- 指数运算 **
数组的扩展
- Array.from()方法用于将两类对象转为真正的数组:类数组对象和可遍历的对象(包括ES6新增的数据结构Set和Map)
- Array.of()方法用于将一组值,转换为数组。
- 数组实例的copyWithin()方法,在当前数组内部,将指定为哈子的成员复制到其他为哈子,然后返回当前数组。会修改当前数组。
- 数组实例的find()和findIndex()数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。另外,这两个方法都可以发现NaN,弥补了数组的IndexOf方法的不足。
- 数组实例的fill方法使用给定的值,填充一个数组。
- 数组实例的entries(),keys()和values()用于遍历数组,他们都返回一个便利器对象,可以用for…of循环进行遍历。
- Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,于字符串的includes方法类似。该方法属于ES7,但Babel转码器已经支持。
- 数组的空位。ES6明确将空位转为undefined.
函数的扩展
- 函数参数的默认值
- rest参数
- 扩展运算符
- 合并数组
- 与解构复制结合
- 函数的返回值
- 字符串
- 实现了Iterator接口的对象
- Map和Set结构,Generator函数
- 函数的name属性,返回该函数的函数名
- 箭头函数
- 函数绑定
- 尾部调用优化
对象的扩展
- 属性的简写表示法
- 属性名表达式
- 方法的name属性,返回对象名。
- Object.is()比较两个值是否相等
- Object.assign()方法用于对象的合并。注意(浅拷贝)
- 属性的可枚举性对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
- 属性的遍历
- for…in 自身和继承可枚举
- Object.keys(obj)自身可枚举
- Object.getOwnPropertyNames(Obj)自身所有属性
- Object.getOwnPropertySybols(obj)包含对象自身的所有Symbol属性
- Reflect.ownKeys(obj) 对象自身所有属性,不管属性名是否是Symbol或字符串,也不管是否可枚举。
- proto属性,Object.setPrototypeOf(),Object.getPrototypeOf()
- Object.values(),Object.entries()
- 对象的扩展运算符
Symbol
Proxy和Reflect
- Proxy支持的拦截操作
- get
- set
- has
- deleteProperty
- ownKeys
- getOwnPropertyNames
- getOwnPropertyDescriptor
- defineProperty
- preventExtensions
- getPrototypeOf
- isExtensible
- setPrototypeOf
- apply
- construct
- Reflect
- get
- set
- has
- deleteProperty
- ownKeys
- getOwnPropertyNames
- getOwnPropertyDescriptor
- defineProperty
- preventExtensions
- getPrototypeOf
- isExtensible
- setPrototypeOf
- apply
- construct
二进制数组
- ArrayBuffer对象
- TypeArray视图
- DataView视图
Set和Map数据结构
- Set,类似于数组,但是成员值都是唯一的,没有重复的值。
- WeakSet,成员只能是对象,而不能是其他类型的值。其次,WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。
- Map
- WeakMapWeakMap结构与Map结构基本类似,唯一的区别是它只接受对象作为键名(null除外),不接受其他类型的值作为键名,而且键名所指向的对象,不计入垃圾回收机制。
Iterator和for…of循环
- Iterator遍历器
- 数据结构默认的Iterator接口,ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是可便利的iterable。调用Symbol.iterator方法,就会得到当前数据结构默认的遍历器生成函数。Symbol.iterator本身就是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的,类型为Symbol的特殊值,所以要放在方括号内。
- ES6中,有三类数据结构原生具备Iterator接口:数组,某些类似数组的对象,Set和Map结构。
- 调用Iterator接口的场合
- 解构赋值
- 扩展运算符
- yield*
- 其他场合
- 字符串的Iterator接口
- Iterator接口和Generator函数
- 遍历器对象的retur(),throw()
- for…of循环
Generator函数
- 应用
- 异步操作的同步化表达
- 控制流管理
- 部署iterator接口
- 作为数据结构
异步操作和Async函数
- Generator函数
- Thunk函数
- co模块
- async函数
class
- Class的继承
- Class的Generaotr方法
- Class的静态方法
- Class的静态属性和实例属性
- new.target属性
- Mixin模式的实现
修饰器
- 类的修饰
- 类的方法的修饰
- Mixin
- Trait