本文共 4026 字,大约阅读时间需要 13 分钟。
一、Symbol
二、Proxy
三、RegExp
RegExp y修饰符
y 表示粘连sticky 每个位置都不能遗漏 每次匹配必须是与上一次连续
u修饰符处理多个字节的中文字符
unicode u修饰符 unicode编码 大于 \uffff 才能正确识别
ES5中 . 不能匹配四个字节的中文字符,需要加 u修饰符
使用unicode码点值匹配 /\u{unicode码点值}/u
四、template 模板字符串
- 字符串换行 `` 换行的时候相当于写了一个\n
- 字符串包含变量或表达式 ${表达式}
- 字符串包含逻辑运算 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优缺点
- 指定回调函数的方式更加灵活 旧的:必须在启动异步任务前指定 promise:启动异步任务-> 返回promise对象 -> 给promise对象绑定回调函数(可以在异步执行任务结束后指定多个)甚至可以在异步任务结束后指定
- 支持链式调用,可以解决回调地狱的问题 回调地狱:回调函数嵌套,外部回调函数异步执行结果是嵌套的回调函数执行的条件 第二个异步任务是以第一个异步任务成功为前提 回调地狱的缺点:不便于阅读,不利于异常处理 解决方案: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() 执行时才去找要执行的那个方法
七、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 表达式
返回 undefinedyield * 可迭代的对象/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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!