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
可删除对象属性deleteProperty
proxy
非入侵对方式监管对象读写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。
#
BigIntBigInt
是一种数字类型的数据,它可以表示任意精度格式的整数。而在其他编程语言中,可以存在不同的数字类型,例如:整数、浮点数、双精度数或大斐波数。
#
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.descriptiondescription 是一个只读属性,它会返回 Symbol 对象的可选描述的字符串。
#
动态引入import允许js文件动态引入,并且不需要模块处理器可直接使用,动态导入(返回Promise),import命令被JS引擎静态分析,先于模块内的其他语句执行,无法取代require()的动态加载功能,提案建议引入import()来代替require(),require()是同步加载,import()是异步加载,用于按需加载、条件加载、模块路径动态化等场景
#
Promise.allSettled()该Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。
参考文档: MDN