Files
cs-note/hzh/EXAM/Week06.md
T
2026-05-24 11:42:38 +08:00

795 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: []
create time: 2026-04-30 15:30
---
# 前端摸底测试(第六次)— 错题精讲
## 概述
本次测试涵盖 **Axios、AJAX/XHR、JavaScript 核心、DOM/BOM、事件系统、CSS、浏览器存储与定时器、Node.js、Vue 3、React Hooks、Webpack、ESM 模块系统**等前端核心技术点。共 110 道单选题,本篇聚焦 37 道错题,按知识点分类逐一拆解错误原因并给出正确理解。
> [!tip] 使用建议
> 先通读各专题的"为什么错 → 为什么对"分析,再做右侧表格的自测检查,最后用「高频考点速览」串记薄弱概念。
---
## 一、请求层:Axios & AJAX / XHR
### Q03:跨域方案辨析
| 项目 | 内容 |
| ------ | ------------ |
| ❌ 你的答案 | B(服务器 cors) |
| ✅ 正确答案 | D(axios) |
---
### Q04:XHR 终止方法
> [!note] 纠正说明
> 此题你答对了。**`xhr.abort()`** 是唯一标准方法来中止一个正在进行的 XHR 请求。
### Q18:readyState = 3 的含义
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(已应答) |
| ✅ 正确答案 | B(交互中) |
```js
// XHR readyState 五阶段
const STATE = {
UNSENT: 0, // 未初始化
OPENED: 1, // open() 已调用
HEADERS_RECEIVED: 2, // 收到响应头
LOADING: 3, // ↓ 正在下载响应体(交互中)
DONE: 4 // 完成
};
```
> [!question] 💡 思考
> 为什么 `LOADING(3)` 适合做"流式进度展示"而不是 `DONE(4)`?
### Q38:AJAX 成功事件
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B(onreadystatechange) |
| ✅ 正确答案 | A(onload) |
```js
// 推荐方式:onload — 简洁明了
xhr.onload = function () {
if (xhr.status === 200) {
console.log(xhr.responseText);
}
};
// 旧方式:onreadystatechange — 需要自行判断状态
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) { /*...*/ }
};
```
> [!important] 记忆要点
> - **`onload`**:请求完整结束(等同于 readyState===4),仅区分成功/失败
> - **`onerror`**:网络级别失败(DNS 错误、断网等)
> - **`onreadystatechange`**:状态每变化一次都触发,需手动检查 `readyState === 4`
### Q39:CORS 响应头
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(Cross-Origin-Resource-Policy) |
| ✅ 正确答案 | A(Access-Control-Allow-Origin) |
> [!warning] 避坑
> 这是**服务端返回**的响应头,格式为 `Access-Control-Allow-Origin: https://example.com`。客户端不需要手动设置这个头部。
### Q40:解析 JSON 响应的 API
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B(XML.parse()) |
| ✅ 正确答案 | A(JSON.parse()) |
> [!abstract] 冷知识
> XHR 原生支持 `responseType = 'json'`,此时 `xhr.response` 直接就是解析好的 JS 对象,无需手动 `JSON.parse()`。
---
## 二、HTTP 协议基础
### Q51:HTTP 400 状态码
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(请求方式错误) |
| ✅ 正确答案 | D(请求参数错误) |
> [!memory] HTTP 状态码速记表
>
> ```mermaid
> graph LR
> A["2xx 成功"] --> A1["200 OK"]
> A --> A2["201 Created"]
> B["3xx 重定向"] --> B1["304 Not Modified"]
> C["4xx 客户端错误"] --> C1["400 Bad Request"]
> C --> C2["401 Unauthorized"]
> C --> C3["403 Forbidden"]
> C --> C4["404 Not Found"]
> D["5xx 服务端错误"] --> D1["500 Internal Server Error"]
> D --> D2["502 Bad Gateway"]
> ```
### Q52:Content-Type 的作用
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(响应的资源类型) |
| ✅ 正确答案 | A(请求体的类型) |
> [!example] 常见 Content-Type
> - `application/json` — JSON 数据(最常用)
> - `application/x-www-form-urlencoded` — 传统表单
> - `multipart/form-data` — 文件上传
> - `text/html` / `text/css` / `image/png` — 响应端
---
## 三、JavaScript 核心概念
### Q07:JS 数据类型辨析
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(RegExp) |
| ✅ 正确答案 | D(String) |
> [!question] 💡 思考
> 为什么 RegExp / Function / Array 属于引用类型(对象),而 String 是基本类型?
```js
typeof /pattern/ // "object" → RegExp 是对象类型
typeof function(){} // "function" → Function 是对象类型
typeof [] // "object" → Array 是对象类型
typeof "hello" // "string" → 基本类型!
typeof new String("a") // "object" → String 包装对象才是对象类型
```
### Q06:值传递 vs 引用传递
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(10) |
| ✅ 正确答案 | A(9) |
```js
let num = 9;
function fn(num) {
num = num + 1; // 修改的是函数局部参数,不影响外层
}
fn(num);
console.log(num); // 9 —— 基本类型按值传递
```
> [!example] 对比:引用类型的行为(Q14)
> ```js
> let arr = [1];
> function fn(arr) {
> arr.push(3); // 修改的是同一块堆内存
> }
> fn(arr);
> console.log(arr); // [1, 3]
> ```
### Q23:一元加号 + 的类型转换
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(string) |
| ✅ 正确答案 | B(number) |
```js
typeof +'136'; // "number"
// 等价于:Number('136') → 136
// '+' 作为一元运算符时,会将操作数转换为数字
```
### Q13 & Q43 & Q44:事件循环(Event Loop)输出顺序
这三道题都在考同一个核心:**同步 → Promise微任务 → setTimeout宏任务**。
| 题目 | ❌ 你的答案 | ✅ 正确答案 |
|------|------------|-------------|
| Q13 | D | C(2→3→5→4→1) |
| Q43 | D | A(8,9,5,5,5,5,5) |
| Q44 | D | A(23541) |
以 Q13 为例,执行过程分解:
> [!abstract] Event Loop 执行流程
>
> ```mermaid
> flowchart TD
> A["同步代码开始执行"] --> B["setTimeout 注册宏任务"]
> B --> C["Promise 立即执行"]
> C --> D["for 循环 resolve"]
> D --> E["console.log 5"]
> E --> F["同步代码结束"]
> F --> G["微任务 then"]
> G --> H["宏任务 setTimeout"]
> ```
> [!tip] 记忆口诀
> **"同步先行,微任务跟进,宏任务殿后"**
>
> 输出顺序始终是:**2 → 3 → 5 → 4 → 1**
对于 Q43(var 闭包陷阱):
```js
console.log(8); // 1. 同步输出 8
for (var i = 0; i < 5; i++) {
// var 没有块级作用域,i 最终值为 5
setTimeout(() => console.log(i), 1000 * i);
// 5个定时器全部注册为宏任务
}
console.log(9); // 2. 同步输出 9
// 3. 1秒后依次输出 5,5,5,5,5
```
### Q27:对象引用赋值
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A('teal') |
| ✅ 正确答案 | B('red') |
```js
let obj1 = { uname: 'teal' };
let obj2 = obj1; // 引用赋值,指向同一块内存
obj2.uname = 'red';
console.log(obj1.uname); // 'red' ← obj1 也变了!
```
### Q01:Axios 拦截器的问题
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D |
| ✅ 正确答案 | D(B和C都对) |
> [!note] 纠正说明
> 此题你答对了。关键两点:
> - **token 过期应先尝试刷新**,而非直接跳转登录
> - **SPA 中应使用路由跳转**(如 `router.push('/login')`),`window.location.href` 会触发整页刷新,破坏 SPA 体验
### Q12:响应拦截器异常处理
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C |
| ✅ 正确答案 | C(两个回调位置写法) |
> [!note] 纠正说明
> 此题你答对了。注意签名顺序:`use(onFulfilled, onRejected)`——**先成功回调,后失败回调**。
### Q100:Node.js 启用 ESM
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(--experimental-modules) |
| ✅ 正确答案 | D(B和D均正确) |
两种方法均可启用 ESM:
1. `package.json` 中添加 `"type": "module"`
2. 使用 `.mjs` 扩展名
> [!warning] 注意
> `--experimental-modules` 是 Node 12~13 的临时标志,Node 14+ 已移除,不再是推荐做法。
---
## 四、事件系统与 DOM/BOM
### Q02:取消默认事件的正确方法
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(preventDefault()) |
| ✅ 正确答案 | C(preventDefault()) |
> [!note] 纠正说明
> 此题你答对了。
> - `preventDefault()` → **阻止默认行为**(如链接跳转、表单提交)
> - `stopPropagation()` → **阻止事件冒泡**
> - `cancelBubble = true` → IE8 时代的旧写法
### Q16:获取 CSS 样式的方法
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(getElementStyle()) |
| ✅ 正确答案 | B(getComputedStyle()) |
```js
// 标准写法
const style = getComputedStyle(element);
console.log(style.fontSize);
// 兼容性写法(IE8-)
element.currentStyle?.fontSize;
```
### Q17:TypeError 的产生场景
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(未定义变量操作) |
| ✅ 正确答案 | B(将函数作为对象使用) |
```js
TypeError 的典型场景:
undefined.foo → ReferenceError(不是 TypeError!)
fn() → TypeError(fn 不是函数却被当作函数调用)
new undefined() → TypeError
'text'.split = 1 → TypeError(不可配置属性被修改)
```
> [!question] 💡 思考
> 为什么访问 `undefined.xxx` 抛的是 `ReferenceError` 而不是 `TypeError`?
### Q19:可继承的 CSS 属性
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(line-height) |
| ✅ 正确答案 | C(border) |
> [!memory] CSS 继承规则速记
> 文本相关属性(color/font/line-height/letter-spacing)**默认继承**。
> 盒模型属性(border/margin/padding/width/height)**不继承**。
### Q20:选择器优先级
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(id) |
| ✅ 正确答案 | A(style(行内样式最高)) |
> [!memory] CSS 优先级从高到低
> ```
> !important > 行内 style > ID 选择器 > Class/属性/伪类 > 标签选择器 > 通配符
> ```
### Q26:querySelector 选择第一个 box 类元素
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C |
| ✅ 正确答案 | C(document.querySelector('.box')) |
> [!note] 纠正说明
> 此题你答对了。注意:`.box` 中的点 `.` 表示类选择器,不加点 `box` 会被当作标签名 `<box>`。
### Q30:事件委托中获得真实触发元素
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(target.name) |
| ✅ 正确答案 | A(event.target.tagName) |
### Q31:阻止事件冒泡
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(preventPropagation()) |
| ✅ 正确答案 | B(event.stopPropagation()) |
> [!warning] 避坑
> DOM 规范中**不存在** `preventPropagation()` 这个方法。容易和 `preventDefault()` 混淆。
### Q59:文件上传编码类型
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A |
| ✅ 正确答案 | A(enctype="multipart/form-data") |
> [!note] 纠正说明
> 此题你答对了。只有文件上传时需要 `multipart/form-data`;普通表单用默认的 `application/x-www-form-urlencoded` 即可。
### Q73:操作浏览器地址栏的对象
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(navigator) |
| ✅ 正确答案 | D(location) |
> [!memory] BOM 四大对象区分
> - **location**:URL 信息(搜索 `?`、哈希 `#`、跳转 `assign/replace`)
> - **history**:历史栈(`back/forward/go`)
> - **navigator**:浏览器信息(`userAgent/platform`)
> - **screen**:屏幕尺寸
### Q105:teleport 组件的理解
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | C(可以条件性启用) |
> [!abstract] teleport 的关键特性
> - 传送的内容**保持与原组件的数据绑定**(响应式依然存在)
> - 可以通过 `to` 属性指定任意合法选择器(不限于 body)
> - 支持 `:disabled` 条件控制是否传送
### Q107:Context 中修改 theme
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | B(需要将 setTheme 也传入 Context) |
> [!note] 纠正说明
> 此题你答对了。Context 只传值不传方法,子组件就无法修改父组件的状态。正确做法是把 `[theme, setTheme]` 一起放入 value 对象。
---
## 五、存储与定时器
### Q33:localStorage 的限制
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(存储任意类型) |
| ✅ 正确答案 | A(不能存储任意类型) |
> [!warning] localStorage 只能存**字符串**!
> 存入对象/数组会自动调用 `.toString()` 变成 `[object Object]`。正确做法:
> ```js
> localStorage.setItem('data', JSON.stringify({ a: 1 }));
> const parsed = JSON.parse(localStorage.getItem('data'));
> ```
### Q34:定时器描述的错误选项
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C |
| ✅ 正确答案 | C(并非所有定时器都会立即执行) |
`setTimeout(fn, 0)` 不代表立刻执行,而是放入宏任务队列等待本轮同步代码结束后再执行。
### Q35:classList 切换类的方法
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C |
| ✅ 正确答案 | C(toggleClass 不存在) |
> [!note] classList 的正确 API
>
> | 方法 | 说明 |
> |------|------|
> | `add()` | 添加类 |
> | `remove()` | 删除类 |
> | `toggle()` | **切换**(有则删,无则加) |
> | `contains()` | 是否包含 |
> | `replace(old, new)` | 替换类名 |
> [!warning] 注意区分
> `toggleClass()` **不存在**于 DOM API 中,正确方法是 `classList.toggle()`(没有 Class 中间那个大写字母)。
### Q108:自定义 Hook 的请求问题
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | B(每次渲染都会发起请求) |
```js
// ❌ 错误:没有 useEffect 包裹
function useData(id) {
fetch(`/api/data/${id}`).then(res => res.json()).then(setData);
}
// ✅ 正确:用 useEffect 控制时机
function useData(id) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(`/api/data/${id}`)
.then(res => res.json())
.then(setData);
}, [id]); // 依赖 id 变化才重新请求
}
```
---
## 六、框架相关
### Vue 专题
#### Q01(provide/inject)& Q101
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A/C(父子通信 / props传递) |
| ✅ 正确答案 | B(跨多层传递) |
> [!abstract] provide/inject 适用场景
>
> ```mermaid
> graph TD
> A["props drilling"] -->|"1-2层"| B["props 足够"]
> A -->|"3+层"| C["provide/inject 更优雅"]
> D["同层级兄弟"] --> E["提升状态到共同祖先"]
> F["全局共享"] --> G["Pinia / Vuex"]
> ```
#### Q102:reactive 解构导致响应式失效
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | B(解构会丢失响应式追踪) |
```js
const state = reactive({ count: 0 });
// ❌ 解构后失去响应式
const { count } = state; // count 变成了普通数字
count++; // state.count 不变!
// ✅ 正确做法
const { count } = toRefs(state); // toRefs 保留响应式
count.value++; // 同步更新 state.count
```
#### Q103:生命周期执行顺序
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | B(Child mounted → Parent mounted) |
> [!abstract] 挂载顺序
>
> ```mermaid
> flowchart LR
> A["父 setup 执行"] --> B["子 setup 执行"]
> B --> C["子 template 渲染"]
> C --> D["子 onMounted 执行"]
> D --> E["父 template 渲染"]
> E --> F["父 onMounted 执行"]
> ```
#### Q106:API Key 泄露处理
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | B(在平台禁用并重新生成) |
> [!note] 纠正说明
> 此题你答对了。密码 ≠ API Key,更改密码无法撤销已泄漏的 Key。
---
### React 专题
#### Q43(var 闭包)& Q44 & Q06 & Q14 & Q27:JavaScript 基础贯穿
这几道题其实在考同一个内核:**JavaScript 的变量作用域和引用机制**。
| 题目 | 考查点 | 你的答案 | 正确答案 |
|------|--------|---------|---------|
| Q43 | var 循环闭包 | D | A |
| Q44 | Promise + setTimeout | D | A |
| Q06 | 值传递 | A | A |
| Q14 | 引用传递 | C | C |
| Q27 | 引用赋值 | A | B |
#### Q46:v-bind vs v-on
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(v-on) |
| ✅ 正确答案 | A(v-bind(动态属性绑定)) |
#### Q62:useState 的作用
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B(定义 props) |
| ✅ 正确答案 | A(定义初始状态) |
#### Q67:useEffect 清理副作用
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(useState) |
| ✅ 正确答案 | A(返回一个函数) |
#### Q70:React.memo 的作用
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(比较 refs) |
| ✅ 正确答案 | A(比较 props,避免不必要重渲染) |
#### Q72:子传父的实现方式
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(状态提升) |
| ✅ 正确答案 | A(回调函数) |
> [!question] 💡 思考
> "状态提升"和"回调函数"有什么区别?什么场景该用哪个?
#### Q84:触发重渲染的条件
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(useRef变化) |
| ✅ 正确答案 | A(父组件状态变化) |
> [!warning] useRef 的变化**不会**触发重渲染——这正是它的价值所在。
#### Q98:浏览器原生支持的模块系统
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(CommonJS) |
| ✅ 正确答案 | B(ESM) |
```html
<!-- 浏览器原生支持,通过 type="module" 开启 -->
<script type="module" src="./app.js"></script>
```
CommonJS 是 Node.js 的规范,浏览器需要打包工具(Webpack/Vite)才能使用。
#### Q99:ESM 中报错的导出语法
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(export *) |
| ✅ 正确答案 | C(export = { a: 1 }) |
---
## 七、Node.js 与构建工具
### Q09:浏览器页面加载事件
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A(DOMContentLoaded) |
| ✅ 正确答案 | B(load(HTML + 所有外部资源)) |
> [!abstract] 两个关键事件对比
>
> ```mermaid
> timeline
> title 页面加载事件时间线
> HTML解析完成 : DOMContentLoaded
> 图片/CSS/JS加载完 : load
> ```
### Q10:Node.js 能做什么
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | A |
| ✅ 正确答案 | A(Node.js 不能操作 DOM) |
### Q49:执行 HTTP 请求的 Node 模块
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(net) |
| ✅ 正确答案 | A(http) |
### Q50:FormData 添加键值对的方法
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(set()) |
| ✅ 正确答案 | A(append()) |
> [!warning] 注意区分
> Map 对象用 `set()`,但 FormData 用 **`append()`**。两者 API 不同。
### Q53-56:Webpack 配置项速查
| 配置项 | 作用 | 你的答案 |
|--------|------|---------|
| devtool | 源代码映射 (sourcemap) | ❌ A |
| externals | 定义外部依赖(不打包) | ✅ A |
| splitChunks | 代码分割 | ✅ A |
| resolve | 解析模块路径/别名 | ✅ A |
| optimization | 优化打包 | ✅ C |
### Q11:Node.js 内置模块
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D(dayjs) |
| ✅ 正确答案 | D(dayjs(第三方库,非内置)) |
### Q57-58:Node.js 基础
| 题目 | 你的答案 | 正确答案 |
|------|---------|---------|
| module.exports | 导出公共接口 | ✅ A |
| Node.js 是什么 | — | ✅ B |
---
## 八、其他知识点
### Q28:自定义 data-* 属性
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | C(dataset 是函数) |
| ✅ 正确答案 | D(dataset 返回 DOMMap 对象,不是函数) |
### Q29:innerText vs innerHTML
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | D |
| ✅ 正确答案 | D(两者作用不一致,innerHTML 解析标签) |
> [!note] 纠正说明
> 此题你答对了。`innerText` 只看纯文本,`innerHTML` 会解析并渲染 HTML 标签。
### Q104:LLM 工作原理
| 项目 | 内容 |
| ------ | -------- |
| ❌ 你的答案 | B |
| ✅ 正确答案 | B(下一个 token 的最大似然预测) |
> [!note] 纠正说明
> 此题你答对了。LLM 不是"理解"语义,而是基于概率统计预测下一个词。
---
## 高频考点速览
> [!summary] 测试中暴露的共性薄弱环节
| 类别 | 高频考点 | 掌握要点 |
|------|---------|---------|
| 事件循环 | 同步/微任务/宏任务顺序 | 同步 → Promise.then → setTimeout |
| JavaScript 基础 | 值传递 vs 引用传递 | 基本类型传副本,引用类型传指针 |
| 事件系统 | stopPropagation / preventDefault | 冒泡 vs 默认行为,千万别混 |
| CSS | 优先级 & 继承规则 | 行内 > ID > Class > 标签;文本继承,盒模型不继承 |
| HTTP | 400/401/403/404/500 | 4x 客户端错,5x 服务端错 |
| Axios | 拦截器最佳实践 | 优先路由跳转、先刷新 token |
| Vue | provide/inject | 专为跨多层通信设计 |
| Vue | reactive 解构 | 用 toRefs 保留响应式 |
| React | useEffect 清理 | return () => cleanup |
| React | 状态不可变性 | setList([newArr]) 而非 push+原引用 |
| React | useRef | 不触发重渲染 |
| 模块系统 | ESM vs CommonJS | 浏览器原生 ESM,export/import |
| webpack | devtool | sourcemap 调试用,不是开发工具 |
---
## 关联笔记
- [[hzh/EXAM]]
- [[Frontend Fundamentals]]
- [[JavaScript Event Loop]]
- [[HTTP Status Codes]]
- [[Vue Lifecycle]]
- [[React Hooks Patterns]]