1.延迟加载JS有哪些方式
延迟加载:async和defer
绿:HTML解析
灰:HTML解析暂停
紫:script脚本的下载
粉:script脚本的执行
1.1 没有加延迟加载的解析流程
HTML解析=》html解析暂停、(script脚本开始下载+script脚本执行)=》继续执行后面的html解析
1.2 async加载的解析流程(async的js执行不按顺序)
HTML解析+js脚本下载=》HTML暂停解析+js脚本执行=》HTML继续解析
1.3 defe加载的解析流程(等html全部解析完成才会执行js代码,且是顺次执行的)
html解析+js脚本下载=》js脚本执行
结果:
1.4 async和defer的区别
1.4.1 js的执行顺序上的区别
defer:等待html全部解析完,才会执行js代码,顺次执行js脚本
async:async和html解析是并行的(可看1.2图),不是顺次执行js脚本,(谁先加载完谁先执行)
2.JS数据类型有哪些
2.1 基本类型(Primitive)
值本身大小固定、不可变,JS 引擎会把值直接存在「栈」区变量槽里,复制时就是纯字节拷贝,两个变量互不干扰。
基本类型有: undefined、null、boolean、number、bigint、string、symbol
2.2 引用类型(Reference)(只要 typeof 结果是 'object' 或 'function',它就一定是引用类型)
值大小不固定、可扩展、可变,引擎只在栈里留一个“门牌号”(指针),真实数据放在「堆」区。复制时只是把门牌号再抄一份,两个变量指向同一块堆内存。 引用类型有:
3.JS数据类型考题(涉及到隐式转换)
3.1 隐式转换规则
4.null和undefined的区别
js最初是这样区分的:
null是一个表示‘无’的 对象(空指针类型), 转化为数值时为0;
undefined表示一个‘无’的 数值(基本类型), 转化为数值时为NaN
4.1 null
js的null会被隐式转换为0,且null为对象格式
5.==和===的区别
5.1 ==比较的是值、 ===比较的是数值类型(===更加严谨)
验证是否被隐式转化:(重写valueOf()方法,改变其内部,验证被隐式转化了)
6. JS微任务和宏任务
要执行宏任务的前提是清空了所有的微任务 流程;同步=》事件循环【包括宏任务和微任务】(微任务=》宏任务)
6.1 JavaScript是单线程语言
单线程:同一个时间只能做一件事情
6.2 JavaScript如何执行异步代码
先执行同步代码,全部同步代码执行完后,再执行事件循环(异步代码)(比如:事件、定时器、请求)