# 为什么 setTimeout 的最小延迟是 4 毫秒?如何模拟 setTimeout 的 0 毫秒延迟?

  • 以前是 0 ,但是会导致主线程会被 setTimeout 频繁占用,影响性能和用户体验;为了规避这种情况,html5 设置为了最小 4ms

  • 模拟方式 1:Promise.resolve().then() 实现,将任务放到微任务队列,它的优先级比 setTimeout 高,能够在同一轮事件循环里面进行回调,几乎是立即执行

  • 模拟方式 2:MessageChannel实现,这是一种更底层的浏览器 API,也是异步回调,利用消息传递机制安排一步执行,几乎是立即执行

# 怎么判断用户的客户端

navigator.userAgent,浏览器的属性,提供了用户客户端的信息,包含了用户浏览器、操作系统、设备等详细信息

# 什么是 词法分析 语法分析

  • 词法分析,逐个字符扫描源代码,根据预定的词法规则,将字符序列组合成词法单元(关键字、运算法、标识符等)

  • 语法分析,根据上下文无关文法(CFG)的语法规则,将词法单元组成成一颗抽象语法树(AST)

int a = 10;
=>
词法单元:
关键字:int; 标识符: a; 赋值操作符: =; 整数常量: 10; 分号: ;
=>
抽象语法树:
Assignment
   ├── Type: int
   ├── Variable: x
   └── Value: 10

# get post 请求的差别

  • 语义不一样,get 是读取资源,post 是提交数据

  • get 参数通过 url 传递,参数可见,而且有大小限制 2048 字符;post 通过请求体传递,url 不会显示数据,适合大量数据、敏感数据

  • get 请求可以被浏览器或代理服务器缓存;post 默认不会被缓存

  • get 是幂等操作,不管发送多少次请求,服务器返回的结果应该是相同的,不会对服务器数据产生影响 post 通常是非幂等操作,一个 post 请求多次发送可能会产生不同的结果