vault backup: 2026-04-30 12:29:38

This commit is contained in:
2026-04-30 12:29:38 +08:00
parent f8c6afa9bd
commit c35905e41a
+794
View File
@@ -0,0 +1,794 @@
---
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]]