ESNext 新特性
块级作用域 let/const#
var声明会提升let、const生明不会提升es6必须先声明变量,再使用变量const在声明同时必须设置初始值,且不能修改
建议:主用 const, 配合 let
数组的解构#
对象的解构#
模版字符串#
可换行、和插入值
带标签的模版字符串#
字符串扩展方法includes/startsWith/endsWith#
参数默认值#
带形参的默认值要放在最后
剩余参数#
es6 以前arguments表示形参
注意:出现在行参最后一位,只能使用一次
展开数组#
箭头函数#
箭头函数 this 的指向(不仅仅是 this,其实 super,new.target 等)由外围最近一层非箭头函数决定
因此,在使用箭头函数声明 say1 方法的时候,this 由 person 的外围决定,而 person 的外围是window
对象字面量增强#
Object.assign#
将多个源对象的属性复制到一个目标对象中, 后面的属性覆盖目标属性
Object.is#
Proxy 代理#
专门为对象设置代理器
es6 以前监听某个对象属性读写使用 Object.defineProperty,也是 vue2.0 双向绑定的实现机制
Proxy vs defineProperty#
defineProperty只能监视读写;Proxy可删除对象属性deletePropertyproxy非入侵对方式监管对象读写proxy更好到对数组对象监视
Reflect 属于一个静态类#
封装类一系列对象对底层操作
最大对意义统一一套操作对象 api
Promise#
class 类#
静态方法 static#
this 不会指向实例对象,指向类型
类的继承 extends#
Set 数据结构#
成员不允许重复,多用于去重
Map 数据结构#
与对象类似,区别在于对象中的键会自动转为toString()类型;
new map()类型键不会转换字符串,可以使用任意类型数据结构作为键
Symbol#
表示独一无二的值 为对象添加独一无二的值 注意:
- 如果属性名的类型是
Number,那么Object.keys返回值是按照key从小到大排序 - 如果属性名的类型是
String,那么Object.keys返回值是按照属性被创建的时间升序排序。 - 如果属性名的类型是
Symbol,那么逻辑同String相同,但其实Object.keys最终会将Symbol类型的属性过滤出去
for of 循环#
只能遍历数组结构类型,遍历对象报错
for of 循环工作原理#
可迭代接口 Iterator
设计模式-迭代器模式#
对外提供统一遍历接口,让外部不用关心内部结构
生成器 Generator#
- 解决异步变成过程中回掉过深嵌套的问题
- 生成器函数返回一个生成器对象
- 惰性执行, 抽一下,动一下
生成器应用
ES Modules#
ES2016#
- 发布与 2016 年 6 月
- 数组实例对象的
includes - 相比与
indexOf可以查找NaN
// 增加指数运算符
ES2017#
- 发布 2017 年 6 月
- Object.values // 遍历值
- Object.entries(obj)
字符串填充方法,尾部加,号
// 参数添加尾逗号
Async/Await 本质使用 Promise 语法糖而已
Promise 相关#
Promise 应用#
微任务是本轮任务的末尾, 每个任务执行后会先执行所有微任务,再执行宏任务
Promise.all#
如果 promise.all 通过 catch 处理
ES2020 确保所有任务都返回,使用 Promise.allSetttled()
Promise 面试题#
Async/await Genertaor 语法糖#
扁平化
依次执行异步任务
this 指向#
取决于调用,箭头函数不会改变 this 指向
正则表达式增强#
ES2018+
ES2020新特性#
ECMAScript语言规范的第10个版本发布(ES2019)
可选链操作符( ?. )#
允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。
BigInt#
BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数。而在其他编程语言中,可以存在不同的数字类型,例如:整数、浮点数、双精度数或大斐波数。
String.prototype.trimStart() / String.prototype.trimEnd()#
分别去掉首尾字符串空格,ES5的String.prototype.trim()用于去掉头尾空格,而String.trimStart()去掉字符串首空格,String.trimEnd()去掉尾空格
Object.fromEntries()#
ES8引入了Object.entries把一个对象转为[key, value]键值对的形式,可以运用于像 Map 这种结构中, Object.fromEntries()用于把键值对还原成对象结构
Array.prototype.flat() / Array.prototype.flatMap()#
把数组展平是Array原型给我们带来的新特性,通过传入层级深度参数(默认为1),来为下层数组提升层级。如果想提升所有层级可以写一个比较大的数字甚至是Infinity,但不推荐使用
Array.prototype.flatMap()是Array.prototype.map()和Array.prototype.flat()的组合,通过对map调整后的数据尝试展平操作
catch 的参数改为可选#
在进行try...catch错误处理过程中,如果没有给catch传参数的话,代码就会报错。新规范中可以省略catch绑定的参数和括号
Symbol.prototype.description#
description 是一个只读属性,它会返回 Symbol 对象的可选描述的字符串。
动态引入import#
允许js文件动态引入,并且不需要模块处理器可直接使用,动态导入(返回Promise),import命令被JS引擎静态分析,先于模块内的其他语句执行,无法取代require()的动态加载功能,提案建议引入import()来代替require(),require()是同步加载,import()是异步加载,用于按需加载、条件加载、模块路径动态化等场景
Promise.allSettled()#
该Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。
参考文档: MDN