ES6知识总结 — 下篇(思维导图版)
发布日期:2022-02-22 16:04:49 浏览次数:41 分类:技术文章

本文共 4026 字,大约阅读时间需要 13 分钟。

一、Symbol

symbol

二、Proxy

proxy

三、RegExp

RegExp y修饰符

y 表示粘连sticky 每个位置都不能遗漏 每次匹配必须是与上一次连续

u修饰符处理多个字节的中文字符

unicode u修饰符 unicode编码 大于 \uffff 才能正确识别

ES5中 . 不能匹配四个字节的中文字符,需要加 u修饰符

使用unicode码点值匹配 /\u{unicode码点值}/u

四、template 模板字符串

  1. 字符串换行 `` 换行的时候相当于写了一个\n
  2. 字符串包含变量或表达式 ${表达式}
  3. 字符串包含逻辑运算 Tag函数 函数名${模板变量/常量} ,使用函数处理,函数控制最终返回结果

五、Promise对象

承诺将来给成功/失败的数据

promise 是js中进行一步编程的新的解决方案 (旧的:纯回调机制)

从语法上来说,Promise是一个构造函数;从功能上来说,Promise对象用来封装一个异步操作,并可以获取其结果。

5.1 Promise的状态

  • promise的三个状态:pending(默认)、 fulfilled、 rejected,new Promise时 报错,只能变成reject状态
  • new Promise(()=>{}) // 接收的参数是一个执行器executor 执行器会立刻执行。一new promise 它就执行
  • promise的成功/失败回调函数是异步执行的

一个promise对象只能改变一次,成功的结果数据一般称为value,失败的结果数据一般称为reason

5.2 Promise 的基本使用

1. 创建一个新的Promise对象 promise()中的回调称为执行器函数(执行器函数是**同步回调**)回调函数中的参数是函数类型const p = new Promsie((resolve,reject)=>{
// 2. 执行异步任务 //3.1 执行成功,调用resolve(value) //3.2 执行失败,调用reject(reason)})p.then( value=>{
//通过回调函数接收参数 } ,reason=>{ //通过回调函数接收参数 } );p.catch(reason=>{
//通过回调函数接收参数 } ); //.then(undefined,reason=>{} ) 的语法糖

5.3 Promise优缺点

  1. 指定回调函数的方式更加灵活
    旧的:必须在启动异步任务前指定
    promise:启动异步任务-> 返回promise对象 -> 给promise对象绑定回调函数(可以在异步执行任务结束后指定多个)甚至可以在异步任务结束后指定
  2. 支持链式调用,可以解决回调地狱的问题
    回调地狱:回调函数嵌套,外部回调函数异步执行结果是嵌套的回调函数执行的条件 第二个异步任务是以第一个异步任务成功为前提
    回调地狱的缺点:不便于阅读,不利于异常处理
    解决方案:promise链式调用 异常传透:任何一个任务出错都会找到 catch()
    终极解决方案:async/await

缺点:基于回调函数;无法终止异步

5.4 .then() 链式调用原理

语法:promise.then(onFulfilled[,onRejected]);参数是两个函数,分别对应resolve和reject方法,传入非函数时,会返回一个空的promise对象
  • promise是一个类,每个promise实例都有自己的状态,不能放在原型上。所有promise实例都有then()方法,放在原型上

  • then() 是promise对象原型上的方法,返回一个新的promise对象实例

  • promise状态改变时调用then()

  • .then() .catch() return一个error对象,不会抛出错误,不会被catch捕获

  • 链式调用后面的内容需要等到前一个调用执行完才加入微任务队列

  • finally() 默认返回原来的promise对象值,它的回调函数时没有参数的(undefined),若抛出异常,返回异常的promise对象

5.5 promise静态方法

  • Promise.resolve(42);//将42转换为promise对象
  • Promise.reject(new Error(‘ss’));//将’ss’转换为promise对象

5.6 promise 异常处理

  • catch((err)=>{console.log(err)}) 捕获reject抛出的错误集合,不需要每个then()中都捕获一次
  • catch() 是promise对象原型链上的实例方法
  • 注意:promise状态变成rejected时使用catch()捕获。一定要用 reject的方式抛出异常 ,而不是 throw new Error

5.7 All 异步操作

接收一组异步任务并行执行,在所有异步操作执行完成后才执行回调。

Promise.all([p1,p2,p3]) //整合多个异步操作的数据,返回promise对象	.then((value)=>{
console.log(value)}) //获取数据

5.8 race([p1(),p2()]) 静态方法

只保留第一个执行完成的异步操作的结果。.先到先得:异步函数哪个加载的快,使用哪个。

六、Reflect

reflect 是一个对象,具备反射机制的功能性函数都会被放到reflect上

反射机制 : 在编译阶段不知道要加载哪个类,而是在运行的时候才加载,执行
eg:先调用apply(),apply() 执行时才去找要执行的那个方法

reflect

七、Generator 生成器

  • Generator 函数运行后,返回一个遍历器对象iterator

如何让遍历停下来

function * loop(){
for(let i=0;i<5;i++){
yield console.log(i); //函数内部使用yield暂停函数的执行。 } }const l = loop();l.next(); // 输出0l.next();//输出1 next() 恢复函数的执行

yield 两种语法:

  • yield 表达式 返回 undefined
  • yield * 可迭代的对象/generator对象 //星号,不是乘号

next() 是一个函数,返回值是一个对象 {value:表示当前遍历的值,done:表示循环是否已经结束}

  • yield 后面不加星号 : {value:Array(3),done:false}

  • yield 后面加星号 : {value:1,done:false}

  • 函数外部改变函数内部的数据

    通过 next() 参数 传递 yield的返回值,将next()的参数作为yield表达式的返回值

  • 函数外部终止函数执行

    return() : generate 函数实例对象.return(); 可以有参数,参数会作为value的值

  • 函数外部向内部抛出异常,函数内部 try…catch 捕获错误

    generate的实例对象.throw(new Error(‘ss’));

八、Iterator (迭代器协议)

  • 字符串 ,map,set 都具有iterator接口

一个可遍历的接口,可以让不支持遍历的数据结构->可遍历

自定义遍历的接口(方法):挂载方法的方式部署接口author[Symbol.iterator] = function(){
// 规范:输入 this(this->author对象本身); 返回值是一个对象 return{
next(){
return{
done:false,// 遍历未结束 true-遍历结束 value:1// 当前所遍历项的值 } } }}

九、ES6模块化

导出:

  • 默认导出: export default function sun(){} //默认导出一个对象 {default:fn}
  • 具名导出(普通导出):export function double(){} //导出的是一个对象 {double:fn}

导入:

  • import XXX from ‘./a.js’ //导入a.js中的default 名称可以改变 导入默认导出的模块

  • import {double} from ‘./a.js’ //解构赋值导入a.js中的double函数

  • import * as obj from ‘./a.js’ //导入所有导出的内容 as 起别名 默认导出的值不在obj中

  • 直接导入 import’./justRun.js’ 相当于把justRun.js运行一遍

  • ES6 模块化是有缓存的,导入多次,只运行一次

导出对象

  • export {code:1,msg:‘success’} 不能这样导出,无法区分的导出的是变量还是对象
  • 可以使用 export default {code:1,msg:‘success’} ,因为它默认导出的就是一个对象

导入对象

  • import {str1,str2} from ‘./export.js’ × 不能使用解构赋值的形式导入,与 export 导出的形式冲突,有歧义
  • import obj from ‘./export.js’ let {str1,str2} = obj ; 只能导入后再解构赋值

注意

  • 重复导出会报错
  • 当使用export default 导出,import 进行导入时 不能加 {} 导入导出名称可以不一致
  • 当使用export 间接导出时,需要加{},导入时也要加{} 导入导出名称要一致

感谢阅读,文中若有不当之处请及时指出 ~

转载地址:https://blog.csdn.net/Conradine_Lian/article/details/108686194 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:快速上手echarts
下一篇:JavaScript 模块化规范

发表评论

最新留言

很好
[***.229.124.182]2024年04月14日 12时42分55秒