1月9日 每日五题
JavaScript 有哪些数据类型
- 基本数据类型 : Number,String,Boolean,Null,Undefined,Symbol,BigInt
- 复杂数据类型(也被称为引用类型) : Object,Array,Function
基础类型存放于栈,变量记录原始值;引用类型存放堆,变量记录地址
事件循环能解释一下吗?
事件循环是 JS 实现异步编程的一种机制,它是为了解决 JavaScript 单线程执行非阻塞操作的
首先,JS 是单线程的,同一时间只能干一件事。它处理异步就靠:调用栈、宏任务队列、微任务队列。
调用栈是执行同步代码的地方,代码来了就往里压,执行完就弹出去,遵循 “后进先出”。
然后异步任务分两类:宏任务和微任务。
宏任务就是像 setTimeout、setInterval、DOM 事件、还有整个 script 脚本这些;
微任务就是 Promise.then/catch、queueMicrotask 这些,微任务的优先级比宏任务高。
接下来事件循环的执行流程,其实就四步,特别好记:
- 先把 调用栈里的同步代码全部执行完,直到栈空为止;
- 然后立刻清空 微任务队列,里面的任务挨个执行,就算执行中又产生了新的微任务,也得在这一轮全部干完;
- 微任务清完了,再去 宏任务队列里拿一个任务执行,注意是拿一个,不是全部;
- 这个宏任务执行完,又要再清一次微任务队列,清完再去宏任务队列拿下一个,反复循环。
宏任务、微任务、同步任务的执行顺序?
先执行所有的同步任务 → 同步任务执行完后,立刻执行所有的微任务 → 所有微任务全部执行完毕后,再去执行「一个」宏任务 → 这个宏任务执行完,又会立刻执行所有微任务,然后再执行下一个宏任务,以此循环往复。
简单回答:
同步任务优先全部做完;
然后清空所有微任务;
最后执行宏任务,执行一个宏任务,就清一次微任务,循环执行。
核心记住一句话:同步 > 微任务 > 宏任务,微任务永远插队在宏任务前面执行。
同步任务有哪些?宏任务都有哪些? 微任务有哪些?
- 同步任务:
console.log、变量 / 函数声明、for/if 循环、new Promise () 内部代码、alert 弹窗
- 微任务:
Promise.then/catch /finally、async await 执行完后的代码、queueMicrotask ()
- 宏任务:
setTimeout、setInterval、DOM 点击 / 滚动等事件、ajax 请求、定时器、整个 script 脚本本身
浏览器从加载到渲染的过程,比如输入一个网址到显示页面的过程
从输入网址到页面显示,核心分 7 步
输入网址 + 回车:我在地址栏输完网址(比如www.baidu.com)按回车,浏览器先判断是不是合法 URL,不是的话就当成搜索关键词去搜,是的话就开始下一步。
DNS 域名解析:浏览器不认识 “baidu.com” 这种域名,得先转换成服务器的 IP 地址(比如 180.101.49.11)。它会先查本地缓存,没有就去问 DNS 服务器,直到拿到 IP,这样才能找到要访问的服务器。
建立 TCP 连接(三次握手):拿到 IP 后,浏览器和服务器通过 TCP 协议建立连接,就像打电话 “喂,能听到吗?”“能听到”“好,那开始说”,三次确认后连接成功,为传数据做准备。
发送 HTTP 请求:连接好后,浏览器给服务器发请求,告诉服务器 “我要访问首页,需要哪些资源(HTML、CSS、JS 这些)”,还会带上请求头(比如浏览器型号、要什么格式的数据)。
服务器处理请求 + 返回响应:服务器收到请求后,会找到对应的资源,处理完后把数据打包成 HTTP 响应发回来,里面包含状态码(比如 200 代表成功)、响应头和实际的资源(HTML 文件是核心)。
关闭 TCP 连接(四次挥手):如果数据传完了,浏览器和服务器就通过四次挥手断开连接,避免占用资源。
浏览器解析 + 渲染页面,这是最后一步,也是关键:
- 先解析 HTML,生成 DOM 树(页面的结构,比如 div、p 这些标签的层级关系);
- 再解析 CSS,生成 CSSOM 树(每个标签的样式,比如颜色、大小);
- 把 DOM 树和 CSSOM 树合并,生成渲染树(只包含要显示的元素和对应的样式);
- 然后布局(计算每个元素的位置和大小)、绘制(把元素画到屏幕上);
- 期间如果遇到 JS 文件,会暂停 HTML 解析(因为 JS 能操作 DOM),先执行 JS(如果是异步 JS,就按之前说的事件循环来),执行完再继续解析渲染,最后页面就显示出来了。
总结一下核心流程:输入网址 → DNS 解析 IP → TCP 三次握手 → 发 HTTP 请求 → 服务器返回资源 → TCP 四次挥手 → 浏览器解析渲染,整个过程就是 “找服务器→传数据→画页面” 的过程。