1.let和const命令
let注意点:
a. 使用let
命令声明变量之前,该变量都是不可用的。(称为“暂时性死区”)
b. let
、const
语句不出现变量提升
c. let
不允许在相同作用域内,重复声明同一个变量。
d. const
一旦声明变量,就必须立即初始化,不能留到以后赋值。
ES6声明变量的6种方法:
Es5中:var 命令和function命令。Es6 let和const命令,还有import命令和class命令。
顶层对象,在浏览器环境指的是window
对象,在 Node 指的是global
对象。
规定:var
命令和function
命令声明的全局变量,依旧是顶层对象的属性,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。
2.变量的解构赋值
语法:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。
3.字符串的扩展及新增方法
1. for...of 遍历字符串
2. JSON.stringify()
的问题在于,它可能返回0xD800
到0xDFFF
之间的单个码点。
3. 模板字符串
模板字符串中嵌入变量,需要将变量名写在${}
之中。
4.实例方法1:
实例方法2:
实例方法3:
实例方法4:
4.数值的扩展
如果参数类型不是NaN
,Number.isNaN
一律返回false
。
Math对象的扩展等等:
5.函数的扩展
1.函数参数指定默认值
这是因为length
属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会计入length
属性。
2.rest参数
注意,rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
函数的length
属性,不包括 rest 参数。
name属性:
箭头函数:
6.数组的扩展
1.扩展运算符
扩展运算符的应用:
1.复制数组
2.合并数组
3.与解构赋值结合
注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
4.字符串
5.Array.from()
Array.from
方法用于将:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)转为真正的数组。
6.对象的扩展及新增方法
1.属性的简洁表示法
2.关键字super
,指向当前对象的原型对象。this
关键字总是指向函数所在的当前对象。
7.Symbol
ES6 引入了一种新的原始数据类型Symbol
,表示独一无二的值。
8.Set 和 Map 数据结构
对象只接受字符串作为键名,为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
8.Proxy
Proxy 用于修改某些操作的默认行为,
9.Reflect
Reflect
对象与Proxy
对象一样,也是 ES6 为了操作对象而提供的新 API。Reflect
对象的设计目的有这样几个。
(1) 将Object
对象的一些明显属于语言内部的方法(比如Object.defineProperty
),放到Reflect
对象上。也就是说,从Reflect
对象上可以拿到语言内部的方法。(2) 修改某些Object
方法的返回结果,让其变得更合理。(3) 让Object
操作都变成函数行为。(4)Reflect
对象的方法与Proxy
对象的方法一一对应,只要是Proxy
对象的方法,就能在Reflect
对象上找到对应的方法。这就让Proxy
对象可以方便地调用对应的Reflect
方法,完成默认行为,作为修改行为的基础。也就是说,不管Proxy
怎么修改默认行为,你总可以在Reflect
上获取默认行为。
10.Promise
所谓Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。有了Promise
对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
1.基本用法:
2.Promise.prototype.then()
then
方法是定义在原型对象Promise.prototype
上的。它的作用是为 Promise 实例添加状态改变时的回调函数。then
方法返回的是一个新的Promise
实例(注意,不是原来那个Promise
实例)。
3.Promise.prototype.catch()
Promise.prototype.catch
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数。另外,then
方法指定的回调函数,如果运行中抛出错误,也会被catch
方法捕获。
4.Promise.prototype.finally()
finally
方法的回调函数不接受任何参数。finally
方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。
5.Promise.all()
(1)只有p1
、p2
、p3
的状态都变成fulfilled
,p
的状态才会变成fulfilled
(2)只要p1
、p2
、p3
之中有一个被rejected
,p
的状态就变成rejected
只要p1
、p2
、p3
之中有一个实例率先改变状态,p
的状态就跟着改变。
6.Promise.resolve()
有时需要将现有对象转为 Promise 对象,Promise.resolve
方法就起到这个作用。
7.Promise.try()
实际开发中,经常遇到一种情况:不知道或者不想区分,函数f
是同步函数还是异步操作,但是想用 Promise 来处理它。
11.Iterator 和 for...of循环
遍历器(Iterator)它是一种接口,目的:为各种不同的数据结构提供统一的访问机制。
Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是 ES6 创造了一种新的遍历命令for...of
循环,Iterator 接口主要供for...of
消费。
Iterator 协议里面next()
方法只能包含同步操作。
当使用for...of
循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。
一种数据结构只要部署了 Iterator 接口,我们就称这种数据结构是“可遍历的”(iterable)。
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator
属性,或者说,一个数据结构只要具有Symbol.iterator
属性,就可以认为是“可遍历的”(iterable)。
for...of
循环,作为遍历所有数据结构的统一的方法。
for...of
循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments
对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。
for...of
循环可以代替数组实例的forEach
方法。
JavaScript 原有的for...in
循环,只能获得对象的键名,不能直接获取键值。ES6 提供for...of
循环,允许遍历获得键值。
12.Generator函数
是一个普通的函数,理解为 一个状态机,封装了多个内部状态。写法如下:
然后,Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象。下一步,必须调用遍历器对象的next
方法,使得指针移向下一个状态。
由于 Generator 函数返回的遍历器对象,只有调用next
方法才会遍历下一个内部状态,所以其实提供了一种可以暂停执行的函数。yield
表达式就是暂停标志。
另外需要注意,yield
表达式只能用在 Generator 函数里面,用在其他地方都会报错。
Generator 函数也不能跟new
命令一起用,会报错。
Generator 函数的一个重要实际意义就是用来处理异步操作,改写回调函数。
13.async函数
async 函数是什么?一句话,它就是 Generator 函数的语法糖。
async
函数对 Generator 函数的改进,体现在以下四点。
14.class的基本用法及继承
class作为对象的模板,让对象原型写法更清晰。
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。