JavaScript 学习路线 MOC
从零基础到可独立交付浏览器与 Node 侧 JavaScript 应用的系统学习路线:七个阶段、依赖关系、逐篇目录与 0 到 1 完成标准。
[!info] related notes
- 所属总入口:JavaScript MOC
- 对象介绍:JavaScript
- 语言规范:ECMAScript · ECMAScript MOC
- 旧入口(保留):JavaScript 核心概念和学习顺序
- 阶段地图:JavaScript 语言基础 MOC · JavaScript 类型与对象模型 MOC · JavaScript 异步与并发 MOC · JavaScript 模块与工程化 MOC · 浏览器 JS MOC · Node.js 侧 JS MOC · JavaScript 运行时与进阶 MOC
JavaScript 学习路线 MOC
这个概念为什么出现
没有依赖顺序的笔记库会制造假进度:会写 async/await 却不懂事件循环,会用 class 却不知原型链,会调框架却不会管模块边界与错误。本路线把「从零到可交付前端逻辑与 Node 脚本/服务」拆成七个阶段,作为学习与复习的主路径。
[!abstract] 路线结论 先建立“值、作用域与执行上下文”的心智,再学对象/原型/
this,随后进入错误、模块与异步;异步必须连同事件循环与取消边界一起学,最后用工程化与宿主环境能力完成真实程序,需要时再下沉到引擎与运行时。
学 JavaScript 最怕把“语法会写”和“语言模型真正建立起来”混为一谈。整条路线围绕五个问题展开:
- 原始值与引用、作用域与闭包分别解决什么问题
- 为什么对象系统以原型为核心,而
class是语法层 - 为什么
this取决于调用方式,而不是定义位置 - 为什么单线程靠事件循环承载异步,微任务与宏任务如何排队
- 为什么模块系统与宿主环境(浏览器 / Node)是“会写语言”的一半
如何使用这份路线
| 场景 | 做法 |
|---|---|
| 从零开始 | 按阶段编号顺序读;每篇先跑最小示例,再看规则与边界 |
| 已有 Java/Python/Go 经验 | 可加速语法,但不要跳过闭包、原型、this 与事件循环 |
| 只抓主干 | 看文末「8 个主干主题」和「0 到 1 完成标准」 |
| 主攻浏览器 | 阶段一到四后优先 浏览器 JS MOC |
| 主攻 Node | 阶段一到四后优先 Node.js 侧 JS MOC |
| 查某一主题 | 先定位阶段表中的文件名,再打开对应笔记 |
| 已熟悉常用 JS/TS API | 快速通过阶段一语法,重点补闭包、原型、异步边界、模块和宿主 API |
难度标记
- L1 入门 · L2 基础巩固 · L3 核心心智 · L4 工程/异步 · L5 运行时与进阶
- 源码:否 / 建议 / 需要 —— 是否值得对照 ECMAScript 规范、MDN 或引擎文档加深
依赖关系总图
flowchart TD
S1["阶段一 基本认知"] --> S2["阶段二 对象与类型模型"]
S2 --> S3["阶段三 错误、模块与抽象"]
S3 --> S4["阶段四 异步与事件循环"]
S3 --> S5["阶段五 工程化开发"]
S4 --> S5
S5 --> S6["阶段六 运行时与进阶"]
S5 --> S7["阶段七 真实项目能力"]
S4 --> S7
S6 --> S7
箭头表示认知依赖,不表示前一阶段必须全部背完。每个阶段都应运行最小例子并观察结果。
阶段与子 MOC 对照
| 阶段 | 目标 | 主要子 MOC |
|---|---|---|
| 一 | 建立值、变量、控制流与函数的默认心智 | JavaScript 语言基础 MOC · ECMAScript MOC |
| 二 | 理解对象、原型、this、类与相等性 | JavaScript 类型与对象模型 MOC |
| 三 | 错误处理、模块边界与可复用抽象 | JavaScript 模块与工程化 MOC |
| 四 | Promise、async/await、事件循环与取消 | JavaScript 异步与并发 MOC |
| 五 | 包管理、测试、构建与 TypeScript 协作 | JavaScript 模块与工程化 MOC · TypeScript MOC |
| 六 | 引擎、内存、性能方法论 | JavaScript 运行时与进阶 MOC |
| 七 | 浏览器 DOM / 网络与 Node 侧交付 | 浏览器 JS MOC · Node.js 侧 JS MOC |
阶段一:建立 JavaScript 的基本认知
目标:能解释 JS 解决什么问题;能在浏览器控制台与 Node 中运行程序;理解变量、类型、表达式、控制流与函数。
完成标准:
- 能用
node与浏览器控制台验证最小脚本 - 能说明
let/const/var与暂时性死区的差异 - 能读懂函数参数、返回值与基础闭包
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 1.1 | JavaScript | JS 是什么、边界在哪 | L1 | 否 |
| 1.2 | ECMAScript | 语言标准与宿主如何分工 | L2 | 建议 |
| 1.3 | ECMAScript 语法基础 | 语句、表达式与基础语法 | L1 | 否 |
| 1.4 | var / let / const | 声明方式如何影响作用域与提升 | L2 | 否 |
| 1.5 | 变量提升 | 提升到底提升了什么 | L2 | 建议 |
| 1.6 | 运算符与表达式 | 运算符、短路与优先级 | L1 | 否 |
| 1.7 | 逻辑语句与控制流 | if/for/switch 如何组织控制流 | L1 | 否 |
| 1.8 | 函数 | 函数声明、表达式与一等公民 | L2 | 否 |
| 1.9 | 类型转换 | 隐式/显式转换规则 | L2 | 建议 |
| 1.10 | null 与 undefined | 两种“空”如何区分 | L2 | 否 |
| 1.11 | 原始值与引用值 | 赋值复制的是值还是引用 | L3 | 建议 |
| 1.12 | 作用域与执行上下文 | 作用域链如何查找名字 | L3 | 建议 |
| 1.13 | 执行上下文 | 调用时创建了哪些环境 | L3 | 建议 |
| 1.14 | 闭包 | 闭包捕获的是变量还是值 | L3 | 建议 |
阶段二:理解对象与类型模型
目标:建立对象属性访问、原型链、this、构造与 class 的统一模型。
完成标准:
- 能手绘一条属性查找原型链
- 能判断四种常见调用下
this指向 - 能解释
class与原型机制的关系
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 2.1 | 对象 | 对象如何存属性与方法 | L2 | 否 |
| 2.2 | 对象总览 | 对象系统全景 | L2 | 否 |
| 2.3 | 基础引用类型 | 常用内置对象能力 | L2 | 否 |
| 2.4 | 集合引用类型 | Map/Set/Weak* 边界 | L2 | 否 |
| 2.5 | 数组 | 数组方法与可变性 | L2 | 否 |
| 2.6 | 字符串与 Unicode | 字符串索引与码点 | L3 | 建议 |
| 2.7 | 原型 | 原型对象解决什么问题 | L3 | 建议 |
| 2.8 | 原型链 | 属性查找如何沿链上升 | L3 | 建议 |
| 2.9 | 原型不是 class | 为何 JS 不是经典类继承 | L3 | 否 |
| 2.10 | 构造函数 | new 前后发生了什么 | L3 | 建议 |
| 2.11 | new 运算符 | new 的步骤与返回值规则 | L3 | 建议 |
| 2.12 | class | class 语法糖落点在哪 | L2 | 否 |
| 2.13 | ES6/ES5 继承对照 | 继承写法如何映射到原型 | L3 | 建议 |
| 2.14 | this 关键字 | this 绑定规则 | L3 | 建议 |
| 2.15 | ECMAScript 面向对象 | 面向对象关系总览 | L3 | 否 |
| 2.16 | 类型检测 | typeof/instanceof 边界 | L2 | 否 |
阶段三:错误、模块与可复用抽象
目标:能显式处理错误,能用模块组织代码,理解迭代器/生成器与代理等抽象边界。
完成标准:
- 能设计可传播的错误信息与恢复策略
- 能说清 ESM 与 CJS 的互操作边界
- 知道何时用 Proxy/迭代器而不是硬编码循环
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 3.1 | try-catch 错误处理 | 异常如何捕获与传播 | L2 | 否 |
| 3.2 | 模块模式 | 模块如何隔离作用域 | L3 | 建议 |
| 3.3 | ES Module import/export | ESM 语法与绑定语义 | L3 | 建议 |
| 3.4 | CommonJS | Node 传统模块如何工作 | L2 | 否 |
| 3.5 | CommonJS / AMD / UMD | 历史模块格式如何演进 | L2 | 否 |
| 3.6 | 迭代器与生成器 | 可迭代协议解决什么 | L3 | 建议 |
| 3.7 | Proxy 与 Reflect | 元编程边界在哪 | L4 | 建议 |
| 3.8 | 正则表达式 | 文本匹配的能力与成本 | L2 | 否 |
| 3.9 | JSON in JS | 序列化边界与安全注意点 | L2 | 否 |
阶段四:异步与事件循环
目标:建立“单线程 + 事件循环 + 任务队列”模型,并掌握 Promise / async 与取消思维。
完成标准:
- 能预测微任务与宏任务的交错顺序
- 能把回调地狱改写为 Promise/async 链
- 能解释为何
sleep不能当同步锁
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 4.1 | 异步总览 | 异步模型全景 | L2 | 否 |
| 4.2 | 同步与异步 | 同步阻塞与异步交接 | L2 | 否 |
| 4.3 | Promise | Promise 状态机如何工作 | L3 | 建议 |
| 4.4 | Promise 与 async | async/await 如何落到 Promise | L3 | 建议 |
| 4.5 | Promise 链 | then 链如何传值与吞错 | L3 | 否 |
| 4.6 | 事件循环 | 浏览器事件循环主线 | L3 | 建议 |
| 4.7 | JS 事件循环(深入) | 宏/微任务排队细节 | L4 | 建议 |
| 4.8 | 定时器与事件监听 | 定时器与监听如何进入队列 | L2 | 否 |
| 4.9 | 进程线程与协程对照 | JS 并发叙事如何对照其他语言 | L3 | 否 |
| 4.10 | Node 事件循环阶段 | Node 相位模型(宿主特化) | L4 | 建议 |
| 4.11 | AbortController 与异步取消 | 异步任务的取消意图如何传播 | L3 | 否 |
阶段五:工程化开发
目标:会用包管理、类型协作、测试与构建把脚本变成可维护项目。
完成标准:
- 能初始化 npm/pnpm 项目并管理依赖
- 理解 TS 与 JS 的协作边界
- 能写出基础单元测试与脚本任务
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 5.1 | package.json | 清单文件如何定义项目 | L2 | 否 |
| 5.2 | 包管理器 | npm/pnpm/yarn 差异 | L2 | 否 |
| 5.3 | 工程化与运行时全景 | 工具链如何拼起来 | L3 | 否 |
| 5.4 | TypeScript | 类型层如何叠在 JS 上 | L3 | 否 |
| 5.5 | JS 到 TS 迁移差异 | 迁移时最常踩什么 | L3 | 否 |
| 5.6 | TypeScript MOC | TS 专题导航 | L2 | 否 |
| 5.7 | Vite | 现代前端开发服务器与构建 | L3 | 否 |
| 5.8 | Vite 学习路线 | 构建工具系统学习 | L3 | 否 |
| 5.9 | 构建与 Electron 打包 | 桌面打包边界 | L4 | 否 |
| 5.10 | 前端测试 | 如何用自动化验证行为和边界 | L3 | 否 |
阶段六:运行时与进阶
目标:理解引擎/内存/性能的边界,区分规范保证与实现细节。
完成标准:
- 能说明堆/栈与 GC 的粗粒度模型
- 知道何时用性能分析而不是凭感觉优化
- 不把 V8 细节写成语言永久承诺
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 6.1 | 内存管理 | 可达性与 GC 粗模型 | L4 | 建议 |
| 6.2 | 工程化与运行时 | 运行时能力地图 | L3 | 否 |
| 6.3 | 运行时与进阶 MOC | 进阶导航 | L4 | 否 |
阶段七:真实项目能力
目标:在浏览器与 Node 宿主中交付交互、网络与服务能力。
完成标准:
- 能用 DOM/事件/Fetch 完成可交互页面逻辑
- 能在 Node 中完成脚本或 HTTP 服务入门
- 知道框架(React/Vue)挂在哪一层,而不替代语言主线
| 序号 | 笔记 | 核心问题 | 难度 | 源码 |
|---|---|---|---|---|
| 7.1 | 浏览器中的 JavaScript | 浏览器宿主总览 | L2 | 否 |
| 7.2 | DOM | 如何查询与更新文档树 | L2 | 否 |
| 7.3 | 事件 | 事件模型与委托 | L2 | 否 |
| 7.4 | BOM | 窗口与导航相关 API | L2 | 否 |
| 7.5 | Fetch API | 网络请求最小闭环 | L2 | 否 |
| 7.6 | 前端 HTTP 请求 | XHR/Fetch/Axios 选型 | L3 | 否 |
| 7.7 | Node.js 中的 JavaScript | Node 宿主总览 | L2 | 否 |
| 7.8 | Node.js MOC | Node 专题导航 | L2 | 否 |
| 7.9 | React 学习路线 | UI 框架分支(可选) | L3 | 否 |
| 7.10 | Vue 学习路线 | UI 框架分支(可选) | L3 | 否 |
| 7.11 | Web Streams 与增量文本解码 | 字节块如何安全还原为文本记录 | L3 | 建议 |
| 7.12 | NDJSON、SSE 与流式协议边界 | 流读取、协议解析和业务事件如何分层 | L4 | 建议 |
如果只抓主干,优先这 8 个主题
一条实用学习原则
不要把 JavaScript 学成“背 API 和框架钩子”。先把 作用域/闭包、原型/this、异步/事件循环、模块 四条主线学稳,再进入工程化、浏览器 API 与框架。
0 到 1 的完成标准
- 能解释闭包为什么能“记住”外层变量
- 能手画属性查找的原型链路径
- 能判断常见调用下
this的指向 - 能预测一段含
Promise与setTimeout的输出顺序 - 能用 ESM 组织多文件并处理基础错误
- 能用 DOM + Fetch 完成一个最小交互闭环
- 能区分 ECMAScript 规范与浏览器/Node 宿主能力
认知跳跃提醒
- 未理解作用域就学闭包 → 先 1.12 / 1.13 / 1.14
- 未理解原型就学 class 继承 → 先 2.7 / 2.8 / 2.12
- 未理解事件循环就堆 async 库 → 先 4.3 / 4.6 / 4.7
- 未理解模块边界就上 monorepo → 先 3.2 / 3.3 / 5.1
相关入口
- 总地图:JavaScript MOC
- 对象定位:JavaScript
- 规范入口:ECMAScript MOC
- 旧顺序页:JavaScript 核心概念和学习顺序(已由本路线承接系统目录)
自测题
- 为什么异步阶段要放在模块与错误之后?
- 浏览器 API 为什么不放在阶段一?
- 若时间有限,优先抓哪 8 个主干?
答案
- 异步代码的正确性依赖错误传播与模块边界,否则只会写出“能跑但不可维护”的回调网。
- DOM/BOM 是宿主能力,应先建立语言心智再叠加宿主。
- 作用域、引用语义、闭包、原型链、this、Promise/async、事件循环、ESM。
BodySense 项目实战入口(把异步/流式路线落到真实代码)
[!info] BodySense 的 AI 回复是 SSE 流式返回的。下面的代码正是你学「Fetch / ReadableStream / 增量解码 / NDJSON·SSE / AbortController」时最好的活样本。阅读顺序:代码注释 → 对应笔记 → 回看代码。
| 想练的知识点 | 去看的代码(仓库内相对路径) | 对应笔记 |
|---|---|---|
fetch + ReadableStream 读取流式响应 | apps/web/src/features/consultation/hooks/useSSEProcessor.ts | Web Streams 增量解码 · NDJSON/SSE 协议边界 |
| 跨 chunk 的 Unicode 代理对断裂 | 同上(解码段) | Web Streams 增量解码 |
AbortController 在卸载/重连时取消流 | 同上(取消段) | AbortController 取消 |
网络字节 → unknown → 收窄为 StreamEvent | packages/contracts/src/stream-events.ts 与 useSSEProcessor.ts | 编译期 vs 运行时边界 |
- 流式链路教材(仓库内):
docs/learning/06-javascript-typescript-streaming.md - 由易到难的实战任务(仓库内):
docs/learning/05-practice-tasks.md - 跨语言对照(Go/Python 如何处理同一契约):Go 学习路线 · Python 学习路线 · BodySense MOC