Skip to content

JavaSript 高级

箭头函数

  • 箭头函数不会创建自己的 this,从上一层作用域继承 this
  • call / apply / bind 方法不能改变箭头函数中 this 的指向
  • 没有 arguments
  • 没有 prototype 不能 new
  • 不能使用 yield 命令,箭头函数不能用作 Generator 函数

WeakSet/WeakMap

  • WeakSet 的成员要求是对象,WeakMap 的键要求是对象。
  • WeakSet 中的对象都是弱引用,如果 WeakSet 中的某个对象不可达(引用置为 null)了,WeakSet 中的该对象会被回收掉。
  • WeakMap 实例仅有 has()、set()、get()、delete()操作方法,没有 size 属性以及 keys()、values()、entries()方法,所以不能获取其所有键值,也就不能迭代。
  • WeakSet/WeakMap 没有部署 Iterator 接口,所以不能用 for...of 遍历。因为 size 取决于垃圾回收机制。
  • 场景
    • WeakSet:保存 dom 节点
    • WeakMap: 给 dom 添加处理函数

垃圾回收机制

  • 引用计数法/标记清除法(可达性分析)
  • 代价假说,新生代,老年代
  • 单线程-全停顿 v8 做了一些优化,增量标记(三色标记法、利用浏览器空闲时间),惰性清理(写屏障),并发并行,目的是减少堆主线程的影响

CJS 和 ESM 模块化对比

  • CJS 模块是运行时加载,ESM 是编译时输出接口
  • CJS 模块输出的是值的拷贝,ESM 输出的是值的引用
  • CJS 模块为同步加载,ESM 支持异步加载
  • CJS 是单个值导出,ESM 可以导出多个
  • CJS 模块的 this 是当前模块,ESM 的 this 是 undefined

for 循环问题

  • var for 里面定义的变量渗透到了外部
  • let 块级作用域,每次循环重新声明一个变量

迭代器和生成器

生成器是一种返回迭代器对象的函数

Promise

ES新特性

2022:class

2021:Promise.any

2020:bigint、import 动态导入、可选链、Promise.allSettled、GlobalThis

2019:flat

2018:for-await-of、Promise.finally

2017:async/await

2016:includes

2015:class、esm、=>、let/const、解构赋值、rest、Promise