第 1 章 JavaScript 简介
JavaScript 是一门动态、基于原型且函数是一等值的通用语言;本章用控制台、语言导览和字符频率直方图把语法、对象、模块与运行环境连成第一条完整程序链。
本章定位
是本章的入口观察量。JavaScript 是一门动态、基于原型且函数是一等值的通用语言;本章用控制台、语言导览和字符频率直方图把语法、对象、模块与运行环境连成第一条完整程序链。 这意味着阅读不能停在 API 名称或最终打印值,而要回答:输入何时进入、值或对象怎样变化、控制权在哪里转移、错误如何传播、宿主资源由谁清理。
六阶段机制链
1. 启动 JavaScript 环境
固定源码、运行环境和输入,在动作发生前记录可见绑定、值类型、对象身份、待处理任务和已打开资源。若起点不稳定,后续比较没有意义。
2. 求值表达式与语句
只执行本阶段最小动作,记录它读取了什么、写入了什么,以及控制权交给语言运行时还是浏览器、Node 或工具链。
3. 组合对象、数组和函数
检查抽象规则是否被真正满足。不要用最终输出反推过程;对象引用、隐式转换、短路与异步调度都可能产生表面相同的结果。
4. 引入类与模块
在边界值、重复输入、迟到结果和错误宿主状态下重放。保存第一个与正常轨迹不同的位置,而不是只保存最后一条异常。
5. 构造字符频率直方图
让失败沿规定通道传播,并核对调用者是否能区分可重试、应停止和必须降级的情况。静默吞错不能作为恢复策略。
6. 核对输入、状态与输出
修复单一故障后重放完全相同的输入。只有绑定、值、任务、句柄和生成产物都回到可预测状态,本章才可以签发。
出版社目录逐项讲解
Chapter 1: Introduction to JavaScript
Chapter 1: Introduction to JavaScript 对应本章“启动 JavaScript 环境”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
1.1 Exploring JavaScript
1.1 Exploring JavaScript 对应本章“求值表达式与语句”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
1.2 Hello World
1.2 Hello World 对应本章“组合对象、数组和函数”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
1.3 A Tour of JavaScript
1.3 A Tour of JavaScript 对应本章“引入类与模块”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
1.4 Example: Character Frequency Histograms
1.4 Example: Character Frequency Histograms 对应本章“构造字符频率直方图”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
1.5 Summary
1.5 Summary 对应本章“核对输入、状态与输出”观察点。先写出输入和值或资源的初始状态,再逐步记录执行后的类型、绑定、调用点、任务顺序或宿主结果。若边界样本与正常样本得到相同最终输出,也必须比较中间轨迹;只有首个偏离点、异常传播与恢复动作都能解释,才算掌握该目录项。
最小可运行实验
const histogram = new Map();
for (const char of "banana") {
histogram.set(char, (histogram.get(char) ?? 0) + 1);
}
console.log([...histogram.entries()].sort());字符频率直方图的端到端拆解
不是一个孤立算法题,而是本章语言导览的验收样本。输入阶段先决定是否区分大小写、空白和组合字符;计数阶段每次读取旧值并写回新值;展示阶段再把 Map 转换为条目数组并排序。任一阶段省略,最终柱形图都可能“看起来合理”却无法复现。
以字符串 "Aáa\u0301" 为边界样本时,视觉上相近的字符不一定具有相同码点。正确实验应先记录原始码点,再分别执行 NFC 规范化和大小写归一化,比较计数键的数量。若直接从最终柱形图猜测输入,会把词法文本、运行时字符串与展示标签混为一谈。
计数容器也要保存过程证据:首次遇到字符时旧值是 undefined,空值合并后写入 1;再次遇到时读取已有计数并递增。若误用 value || 0,本例仍可能正确,但它会把合法的 0 与缺失值合并。这里选择空值合并,是为了让“键不存在”成为明确的分支条件。
最后分别保留插入顺序和排序后顺序。Map 保证按插入顺序迭代,而展示层常按字符或频次排序;排序只作用于新建的条目数组,不应暗中改变计数容器。这样就能从一段小程序观察值、对象、函数、迭代和模块化输出五类基础机制。
book: JavaScript 权威指南(原书第 7 版)
page: jdg-01-introduction
official_entries: 6
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 | 类型边界与停止条件 | 不发生隐式越界 |
| 失败 | 错误参数、拒绝、断流或工具失败 | 首个偏离点 | 明确停止、传播或降级 |
| 恢复 | 修复后重放完全相同输入 | 清理后的状态与任务数 | 无旧值、旧任务和旧资源 |
本页签发不变量是:JavaScript 是一门动态、基于原型且函数是一等值的通用语言;本章用控制台、语言导览和字符频率直方图把语法、对象、模块与运行环境连成第一条完整程序链。 单次输出、截图或一次测试通过不能替代值语义、控制流、对象身份、异步顺序和宿主资源的完整轨迹。
练习
小结
- 表达式:对应“启动 JavaScript 环境”阶段的核心观察量。
- 语句:对应“求值表达式与语句”阶段的核心观察量。
- 对象:对应“组合对象、数组和函数”阶段的核心观察量。
- 函数:对应“引入类与模块”阶段的核心观察量。
- 模块:对应“构造字符频率直方图”阶段的核心观察量。
- 6 个出版社目录条目已经全部映射到本章证据链。
- 正常、边界、失败和恢复样本共同决定是否通过,最终输出不是唯一证据。
术语表
版本与改编边界
本单元以 David Flanagan 的英文第 7 版和李松峰译中文第 7 版为身份基线。目录来自 O’Reilly 出版社公开页面,正文是独立教学重构,不复制原书段落;工具版本、浏览器能力和 Node API 的现状需另行按当前官方文档核验。