第 2 章 词法结构
源码先受字符集、注释、字面量、标识符和分号规则约束,再进入语法与执行;Unicode 规范化和自动分号插入会让视觉相似的文本产生不同程序。
本章定位
是本章的入口观察量。源码先受字符集、注释、字面量、标识符和分号规则约束,再进入语法与执行;Unicode 规范化和自动分号插入会让视觉相似的文本产生不同程序。 这意味着阅读不能停在 API 名称或最终打印值,而要回答:输入何时进入、值或对象怎样变化、控制权在哪里转移、错误如何传播、宿主资源由谁清理。
六阶段机制链
1. 读取 Unicode 源文本
固定源码、运行环境和输入,在动作发生前记录可见绑定、值类型、对象身份、待处理任务和已打开资源。若起点不稳定,后续比较没有意义。
2. 剔除注释并识别字面量
只执行本阶段最小动作,记录它读取了什么、写入了什么,以及控制权交给语言运行时还是浏览器、Node 或工具链。
3. 解析标识符与保留字
检查抽象规则是否被真正满足。不要用最终输出反推过程;对象引用、隐式转换、短路与异步调度都可能产生表面相同的结果。
4. 处理转义与规范化
在边界值、重复输入、迟到结果和错误宿主状态下重放。保存第一个与正常轨迹不同的位置,而不是只保存最后一条异常。
5. 判定语句边界
让失败沿规定通道传播,并核对调用者是否能区分可重试、应停止和必须降级的情况。静默吞错不能作为恢复策略。
6. 输出稳定 token 流
修复单一故障后重放完全相同的输入。只有绑定、值、任务、句柄和生成产物都回到可预测状态,本章才可以签发。
出版社目录逐项讲解
Chapter 2: Lexical Structure
Chapter 2: Lexical Structure 对应本章“读取 Unicode 源文本”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.1 The Text of a JavaScript Program
2.1 The Text of a JavaScript Program 对应本章“剔除注释并识别字面量”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.2 Comments
2.2 Comments 对应本章“解析标识符与保留字”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.3 Literals
2.3 Literals 对应本章“处理转义与规范化”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.4 Identifiers and Reserved Words
2.4 Identifiers and Reserved Words 对应本章“判定语句边界”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.4.1 Reserved Words
2.4.1 Reserved Words 对应本章“输出稳定 token 流”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.5 Unicode
2.5 Unicode 对应本章“读取 Unicode 源文本”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.5.1 Unicode Escape Sequences
2.5.1 Unicode Escape Sequences 对应本章“剔除注释并识别字面量”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.5.2 Unicode Normalization
2.5.2 Unicode Normalization 对应本章“解析标识符与保留字”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.6 Optional Semicolons
2.6 Optional Semicolons 对应本章“处理转义与规范化”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
2.7 Summary
2.7 Summary 对应本章“判定语句边界”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
最小可运行实验
const café = "decomposed";
const café = "composed";
console.log(café.normalize("NFC") === café.normalize("NFC"));book: JavaScript 权威指南(原书第 7 版)
page: jdg-02-lexical-structure
official_entries: 11
sample: normal | boundary | failure | recovery
first_divergence: null
values_explained: true
ordering_explained: true
cleanup_complete: truefreeze source + runtime + input
predict values + references + control flow + tasks
inject one controlled fault
stop at first divergence
recover and replay the same sample
assert stable state and no stale work常见误区与故障注入
四类样本与验收
| 样本 | 注入方式 | 必查证据 | 通过条件 |
|---|---|---|---|
| 正常 | 规范输入与单次执行 | 值、对象、调用点、任务、资源 | 六阶段按预期完成 |
| 边界 | 空值、极值、重复输入或慢 I/O | 类型边界与停止条件 | 不发生隐式越界 |
| 失败 | 错误参数、拒绝、断流或工具失败 | 首个偏离点 | 明确停止、传播或降级 |
| 恢复 | 修复后重放完全相同输入 | 清理后的状态与任务数 | 无旧值、旧任务和旧资源 |
本页签发不变量是:源码先受字符集、注释、字面量、标识符和分号规则约束,再进入语法与执行;Unicode 规范化和自动分号插入会让视觉相似的文本产生不同程序。 单次输出、截图或一次测试通过不能替代值语义、控制流、对象身份、异步顺序和宿主资源的完整轨迹。
练习
小结
- 字面量:对应“读取 Unicode 源文本”阶段的核心观察量。
- 标识符:对应“剔除注释并识别字面量”阶段的核心观察量。
- 保留字:对应“解析标识符与保留字”阶段的核心观察量。
- Unicode:对应“处理转义与规范化”阶段的核心观察量。
- 自动分号插入:对应“判定语句边界”阶段的核心观察量。
- 11 个出版社目录条目已经全部映射到本章证据链。
- 正常、边界、失败和恢复样本共同决定是否通过,最终输出不是唯一证据。
术语表
版本与改编边界
本单元以 David Flanagan 的英文第 7 版和李松峰译中文第 7 版为身份基线。目录来自 O’Reilly 出版社公开页面,正文是独立教学重构,不复制原书段落;工具版本、浏览器能力和 Node API 的现状需另行按当前官方文档核验。