官方认证的Es6新特性有哪些?总结一下

179 阅读7分钟

ES6有哪些新特性?

ES6是2015年推出的一个新的版本、这个版本相对于ES5的语法做了很多的优化

let和const是什么

let:

  • 声明变量
  • 没有变量提升
  • 不可重复声明
  • 具有块级作用域
  • 声明变量后可以在使用时赋值

const:

  • 只读常量
  • 没有变量提升
  • 不可重复声明
  • 具有块级作用域
  • 声明变量后必须立马赋值

箭头函数

使用 "箭头" ( => ) 来定义函数. 箭头函数相当于匿名函数, 并且简化了函数定义

箭头函数的特征:

  • 箭头函数没有this, this指向定义箭头函数所处的外部环境
  • 箭头函数的this永远不会变,call、apply、bind也无法改变
  • 箭头函数只能声明成匿名函数,但可以通过表达式的方式让箭头函数具名
  • 箭头函数没有原型prototype
  • 箭头函数不能当做一个构造函数 因为 this 的指向问题
  • 箭头函数没有 arguments 在箭头函数内部访问这个变量访问的是外部环境的arguments, 可以使用 ...代替

解构赋值

常用对象解构:

对象解构的语法形式是在一个赋值操作符左边放置一个对象字面量

常用数组解构:

它使用的是数组字面量,且解构操作全部在数组内完成,而不是像对象字面量语法一样使用对象的命名属性

字符串解构const [a, b, c, d, e] = "hello"

数值解构const { toString: s } = 123

布尔解构const { toString: b } = true

对象解构

  • 形式:const { x, y } = { x: 1, y: 2 }
  • 默认:const { x, y = 2 } = { x: 1 }
  • 改名:const { x, y: z } = { x: 1, y: 2 }

数组解构

  • 规则:数据结构具有Iterator接口可采用数组形式的解构赋值
  • 形式:const [x, y] = [1, 2]
  • 默认:const [x, y = 2] = [1]

函数参数解构

  • 数组解构:function Func([x = 0, y = 1]) {}
  • 对象解构:function Func({ x = 0, y = 1 } = {}) {}

应用场景:

  • 交换变量值:[x, y] = [y, x]
  • 返回函数多个值:const [x, y, z] = Func()
  • 定义函数参数:Func([1, 2])
  • 提取JSON数据:const { name, version } = packageJson
  • 定义函数参数默认值:function Func({ x = 1, y = 2 } = {}) {}
  • 遍历Map结构:for (let [k, v] of Map) {}
  • 输入模块指定属性和方法:const { readFile, writeFile } = require("fs")

注意点

  • 匹配模式:只要等号两边的模式相同,左边的变量就会被赋予对应的值
  • 解构赋值规则:只要等号右边的值不是对象或数组,就先将其转为对象
  • 解构默认值生效条件:属性值严格等于undefined
  • 解构遵循匹配模式
  • 解构不成功时变量的值等于undefined
  • undefinednull无法转为对象,因此无法进行解构

promise

  1. 是js中进行异步编程的新的解决方案( 解决回调地狱 )

class类

新增了模块化、利用import 、export来实现导入、导出

按需导入是怎么实现的

剩余运算符

promise

promise 是什么

  1. 是ES6新增的语法
  2. 是js中进行异步编程的新的解决方案( 解决回调地狱 )
  3. 语法上说 promise 是一个构造函数
  4. 从功能上说 promise 对象用来封装一个异步操作并以获取到成功或失败后的值

promise 的状态改变

  1. pending 变为 resolved
  2. pending 变为 rejected
  3. 只有这两种 且一个 promise 对象只能改变一次无论成功还是失败,都会有个结果

promise 的API

  1. 构造函数 Promise( excutor ){ }

    • executor 函数: 执行器 ( resolve, reject ) =>{ }
    • resolve 函数: 内部定义成功时我们调用的函数 value => { }
    • reject 函数: 内部定义失败时我们调用的函数 reason => { }
    • 说明: executor 会在 Promise 内部立即同步调用,异步操作在执行器中执行
  2. Promise.prototype.then 方法: (onResolved, onRejected) => {}

    • onResolved 函数: 成功的回调函数 (value) => {}

    • onRejected 函数: 失败的回调函数 (reason) => {}

    • 指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调

      返回一个新的 promise 对象

  3. Promise.prototype.catch 方法: (onRejected) => {}

    • onRejected 函数: 失败的回调函数 (reason) => {}
  4. Promise.resolve 方法: (value) => {}

    • value: 成功的数据或 promise 对象
    • 说明: 返回一个成功/失败的 promise 对象
  5. Promise.reject 方法: (reason) => {}

    • reason: 失败的原因
    • 说明: 返回一个失败的 promise 对象
  6. Promise.all 方法: (promises) => {}

    • promises: 包含 n 个 promise 的数组
    • 说明: 返回一个新的 promise, 只有所有的 promise 都成功才成功, 只要有一个失败了就直接失败
  7. Promise.race 方法: (promises) => {}

    • promises: 包含 n 个 promise 的数组
    • 说明: 返回一个新的 promise, 第一个完成的 promise 的结果状态就是最终的结果状态

如何改变 promise 的状态

  • resolve(value): 如果当前是 pending 就会变为 resolved
  • eject(reason): 如果当前是 pending 就会变为 rejected
  • 抛出异常: 如果当前是 pending 就会变为 rejected

一个promise指定多个成功 / 失败回调函数, 都会调用吗?

  • 当 promise 改变为对应状态时都会调用

改变 promise 状态和指定回调函数谁先谁后?

  1. 都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调

  2. 如何先改状态再指定回调?

    • 在执行器中直接调用 resolve()/reject()
    • 延迟更长时间才调用 then()
  3. 什么时候才能得到数据?

    • 如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据
    • 如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据

promise.then()返回的新 promise 的结果状态由什么决定?

  1. 简单表达: 由 then()指定的回调函数执行的结果决定

  2. 详细表达:

    • 如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常
    • 如果返回的是非 promise 的任意值, 新 promise 变为 resolved, value 为返回的值
    • 如果返回的是另一个新 promise, 此 promise 的结果就会成为新 promise 的结果

promise 如何串连多个操作任务?

  • promise 的 then()返回一个新的 promise, 可以开成 then()的链式调用
  • 通过 then 的链式调用串连多个同步/异步任务

promise 异常传透?

  • 当使用 promise 的 then 链式调用时, 可以在最后指定失败的回调,
  • 前面任何操作出了异常, 都会传到最后失败的回调中处理

中断 promise 链?

  • 当使用 promise 的 then 链式调用时, 在中间中断, 不再调用后面的回调函数
  • 办法: 在回调函数中返回一个 pendding 状态的 promise 对象

自定义 / 手写 promise

  1. 写个自调用函数
  2. 在自调用函数里面写一个具名函数 Promise
  3. 在这个函数的原型上用 prototype.then 上面挂一个函数, 指定promise 成功 / 失败的回调函数, 函数的返回值是一个新的 promise 对象

链式调用: promises/A+规范

基于规范的描述,我们得到以下几点:

  • then方法本身会返回一个新的Promise对象,返回一个新的Promise以后它就有自己的then方法,这样就能实现无限的链式
  • 不论 promise1resolve() 还是被 reject()promise2 都会执行 Promise 解决过程:[[Resolve]](promise2, x)

在手写这里我们把这个 Promise 解决过程:[[Resolve]](promise2, x) 命名为 resolvePromise() 方法,参数为 (promise2, x, resolve, reject) 即:

async与await

async

  1. 函数的返回值为 promise 对象
  2. promise 对象的结果由 async 函数执行的返回值决定

await

  1. await 右侧的表达式一般为 promise 对象, 但也可以是其它的值
  2. 如果表达式是 promise 对象, await 返回的是 promise 成功的值
  3. 如果表达式是其它值, 直接将此值作为 await 的返回值

注意点

  1. await 必须写在 async 函数中, 但 async 函数中可以没有 await
  2. 如果 await 的 promise 失败了, 就会抛出异常, 需要通过 try...catch 捕获处理