# 《JavaScript权威指南(原书第6版)》知识点全解 > AI生成|2026年10月28日|codebuddy|原书:David Flanagan《JavaScript权威指南(原书第6版)》,机械工业出版社,2012-04-25 > **我的阅读**:进度 100%|累计 9小时50分钟|开始 2017-08-22|最近 2021-01-11|读完 2020-03-26 **一句话总结**:把 JavaScript 从词法、类型、对象模型一路讲到浏览器宿主环境(DOM、CSS、事件、HTTP、存储、图形),用一本书建立"语言内核 + 平台 API"的完整坐标系,并附可随时查阅的核心参考。 **适合谁 / 前置知识**:适合已有少量编程经验、需要系统补齐 JS 语义细节与浏览器 API 全貌的开发者;也适合作为长期案头参考书。不适合零基础读者(前 12 章节奏偏密,缺少循序渐进的练习),也不适合只想学某个框架的人。前置:至少要写过变量、循环、函数;了解 HTML/CSS 基本结构;知道浏览器有开发者工具。 ## 一、全书地图 | 部分 | 内容 | 章节 | 逻辑定位 | |---|---|---|---| | 开篇 | JavaScript 概述 | 第1章 | 用一段完整示例把语言核心与客户端 API 串起来,先给全景再拆解 | | 第一部分 | JavaScript 语言核心 | 第2章 词法结构;第3章 类型、值和变量;第4章 表达式和运算符;第5章 语句;第6章 对象;第7章 数组;第8章 函数;第9章 类和模块;第10章 正则表达式的模式匹配;第11章 JavaScript 的子集和扩展;第12章 服务器端 JavaScript | 自底向上:字符 → 类型 → 表达式 → 语句 → 复合数据结构(对象/数组)→ 抽象单位(函数/类/模块)→ 文本处理(正则)→ 语言边界(子集、扩展、宿主) | | 第二部分 | 客户端 JavaScript | 第13章 Web 浏览器中的 JavaScript;第14章 Window 对象;第15章 脚本化文档;第16章 脚本化 CSS;第17章 事件处理;第18章 脚本化 HTTP;第19章 jQuery 类库;第20章 客户端存储;第21章 多媒体和图形编程;第22章 HTML5 API | 自外向内:运行环境(13)→ 全局对象(14)→ 文档(15)→ 样式(16)→ 交互(17)→ 数据通道(18)→ 库的封装(19)→ 本地状态(20)→ 富媒体(21、22) | | 第三部分 | JavaScript 核心参考 | JavaScript 核心参考(无章节号,按对象/方法条目编排) | 语言内置对象与函数的速查 | | 第四部分 | 客户端 JavaScript 参考 | 客户端 JavaScript 参考(无章节号,按 API 条目编排) | 浏览器 API 的速查 | **关系读法**:第一部分是"语言能表达什么",第二部分是"语言在浏览器里能操作什么",第三、四部分是前两部分的索引化沉淀。第9章(类与模块)是语言核心的收口,第13章是客户端的入口,两者之间没有依赖跳跃——第 13 章默认你已经会用闭包和原型。 ## 二、核心知识点 **1. 类型系统:原始值与对象的分野(第3章)** 是什么:JS 的值分两类——原始值(字符串、数字、布尔、null、undefined,第6版语境下加上 ES6 新增的 Symbol)与对象(含数组、函数、日期、正则)。原始值不可变、按值比较;对象是引用,按引用比较。 为什么重要:几乎所有"看起来诡异"的行为都源于这条分界线——赋值是复制值还是复制引用、`==` 为什么有时相等、函数传参为什么改不动外部的原始值。 怎么用:判断用 `typeof`(对 `null` 返回 `"object"`,这是历史遗留),判空用 `x === null`,判断对象类型用 `Object.prototype.toString.call(x)`。 常见误区:把 `typeof null === "object"` 当成 bug 去"修复";以为字符串是对象所以能改,实际 `s[0] = "x"` 静默失败(非严格模式)。 **2. 类型转换与相等性(第3章、第4章)** 是什么:JS 有三套相等:`==`(允许隐式转换)、`===`(不做转换)、`Object.is`(区分 `NaN` 与 `-0`)。转换规则由 ToPrimitive → valueOf/toString 的顺序决定。 为什么重要:隐式转换是 bug 高发区,也是老代码兼容性的根源。 怎么用:默认一律 `===`;只在"判 null 或 undefined"时用 `x == null`(一次拦截两者);数字解析用 `Number()` 而非 `parseInt` 的隐式截断。 常见误区:`[] == false` 为真、`"0" == false` 为真——这些不是异常而是规则;用 `if (x)` 判断数字 0 或空字符串会误判,必须显式比较。 **3. 作用域、提升与声明方式(第3章、第8章)** 是什么:`var` 的函数级作用域与变量提升(声明提升、赋值不提升);函数声明整体提升;`let/const` 的块级作用域与暂时性死区(TDZ)。 为什么重要:提升解释了"为什么在声明前调用函数可以,访问变量却是 undefined"。 怎么用:新代码统一 `const` 优先、需要重赋值用 `let`、避免 `var`;把声明写在作用域顶部以贴合阅读顺序。 常见误区:以为 `var` 提升会把值也带上去;在循环里用 `var` 捕获闭包,得到的是同一个变量。 **4. 对象与原型链(第6章)** 是什么:每个对象有内部 `[[Prototype]]`,属性查找沿原型链向上,直到 `Object.prototype` 或 `null`。`new` 做的事是:创建对象 → 挂原型 → 执行构造函数 → 返回对象。 为什么重要:JS 没有类继承的语法糖之前,复用全靠原型链;理解它才能读懂 `instanceof`、`Object.create`、`constructor`。 怎么用:`Object.create(proto)` 做纯原型继承;`Object.getPrototypeOf` 查原型;`hasOwnProperty` 区分自有与继承属性。 常见误区:改 `prototype` 上的对象属性会污染所有实例;`for...in` 会枚举继承的可枚举属性,遍历自有属性要用 `Object.keys`。 **5. 属性特性:数据属性与访问器属性(第6章)** 是什么:属性有 `value/writable/enumerable/configurable` 四个特性,或 `get/set` 访问器。`Object.defineProperty` 可精确控制。 为什么重要:`enumerable` 决定是否出现在 `for...in`/`Object.keys`;`writable:false` 可做只读常量;访问器是 Vue 2 响应式的原理基础。 怎么用:`Object.defineProperty(obj, "x", { get(){...}, set(v){...} })`;批量用 `Object.defineProperties`;查看用 `Object.getOwnPropertyDescriptor`。 常见误区:以为 `obj.x = 1` 一定能赋值——只读属性在非严格模式下静默失败,严格模式才抛错。 **6. 数组与类数组对象(第7章)** 是什么:JS 数组是特殊对象,索引是字符串键,`length` 可写。稀疏数组有"空洞",与 `undefined` 元素不同。类数组(`arguments`、NodeList)有 `length` 和索引但无数组方法。 为什么重要:`length` 可写导致截断/扩容的隐式行为;类数组转数组是高频操作。 怎么用:`Array.prototype.slice.call(arguments)` 或 `Array.from` 转类数组;`Array.isArray` 判断;遍历用 `forEach/map/filter/reduce` 而非 `for...in`。 常见误区:`delete arr[1]` 只留空洞不改 `length`;`sort()` 默认按字符串排序,数字数组必须传比较函数。 **7. 函数的调用模式与 this(第8章)** 是什么:四种调用:方法调用(`this` 为宿主对象)、函数调用(非严格模式为全局对象,严格模式 `undefined`)、构造调用(`this` 为新对象)、`call/apply/bind` 显式指定。 为什么重要:`this` 是 JS 最易错点,也是回调丢失上下文的原因。 怎么用:回调传 `fn.bind(obj)`;`apply` 传数组参数;不确定时用箭头函数(继承外层 `this`)。 常见误区:把方法拆出来单独调用(`const f = obj.m; f()`)会丢 `this`;`bind` 返回新函数,不会修改原函数。 **8. 闭包(第8章)** 是什么:函数与其定义时所在词法环境的组合。外层函数返回后,内层函数仍能访问外层变量。 为什么重要:模块化、私有状态、柯里化、事件回调的基础。 怎么用:用 IIFE 或块级作用域隔离循环变量;用闭包做计数器/缓存;注意不再需要的引用要置空。 常见误区:以为闭包"复制"了变量——它共享同一个绑定;循环里 `var` + 异步回调会全部输出最后一个值。 **9. 类、原型式继承与模块(第9章)** 是什么:第6版同时讲两套:ES5 的构造函数 + 原型链 + 借用构造函数(经典继承),与 ES6 的 `class/extends/super`。模块部分讲 IIFE 命名空间、CommonJS、AMD 与 ES6 模块。 为什么重要:这是从"会写函数"到"能组织代码"的分水岭;也是理解框架源码的前提。 怎么用:ES6 用 `class` 声明、`extends` 继承、`super()` 调父构造;组合优于深继承;模块导出用 `export`,按需加载避免全局污染。 常见误区:`class` 本质仍是原型,方法在 `prototype` 上而非实例上;子类构造函数里 `super()` 之前不能用 `this`。 **10. 正则表达式的模式匹配(第10章)** 是什么:字面量 `/pattern/flags` 或 `RegExp` 构造;元字符、字符类、量词、分组、断言、贪婪/惰性。`String` 的 `match/replace/search/split` 与 `RegExp` 的 `test/exec` 配合。 为什么重要:文本校验、解析、批量替换的通用工具,跨语言可迁移。 怎么用:`g` 全局、`i` 忽略大小写、`m` 多行;`exec` 带 `g` 时可循环取所有匹配并读取捕获组;替换用 `$1` 引用分组或函数回调。 常见误区:带 `g` 的正则对象有 `lastIndex` 状态,复用会跳过匹配;`.` 不匹配换行;量词贪婪导致回溯爆炸。 **11. 事件模型:捕获、冒泡与委托(第17章)** 是什么:事件从 `window` 向下捕获到目标,再向上冒泡。`addEventListener(type, fn, useCapture)` 第三参控制阶段;`stopPropagation` 阻止传播,`preventDefault` 阻止默认行为。 为什么重要:所有交互逻辑的入口;委托是性能与动态列表的关键手段。 怎么用:把监听挂在父容器,用 `event.target` 判断来源(事件委托);同一元素同一类型同一阶段重复添加会被去重;移除必须传同一函数引用。 常见误区:混淆 `stopPropagation` 与 `preventDefault`;在捕获阶段误判 `this` 与 `target`;`return false` 只在特定属性(如 `onclick`)里等价于两者都做。 **12. 脚本化文档与 DOM 操作(第15章)** 是什么:DOM 是节点树;查询(`getElementById/querySelector(All)`)、遍历(`parentNode/childNodes/nextSibling`)、修改(`createElement/appendChild/insertBefore/replaceChild`)、属性与 `dataset`。 为什么重要:一切前端渲染的底层;理解重排(reflow)与重绘(repaint)才知道性能从哪来。 怎么用:批量修改先 `documentFragment` 或先脱离文档;读写分离避免强制同步布局;用 `textContent` 而非 `innerHTML` 拼接用户输入。 常见误区:`childNodes` 含文本节点,`children` 只含元素;`innerHTML` 拼接用户内容导致 XSS;频繁 `appendChild` 触发多次重排。 **13. 脚本化 HTTP、Ajax 与同源策略(第18章)** 是什么:`XMLHttpRequest` 的生命周期(`open → setRequestHeader → send → onreadystatechange/onload`);JSON 编解码;同源策略限制跨域读取;CORS 与 JSONP 是绕过手段。 为什么重要:前后端分离架构的基础;跨域是初学者第一个"卡死"的问题。 怎么用:优先 `fetch`(第6版成书时以 XHR 为主,fetch 属后续标准,此处标注:待核对版本适配);设置 `responseType` 处理二进制;跨域由服务端返回 `Access-Control-Allow-Origin`。 常见误区:以为设置了请求头就能跨域(实际由响应头决定);`withCredentials` 与 `*` 通配不可共存;GET 带缓存需加时间戳或 `Cache-Control`。 **14. 客户端存储(第20章)** 是什么:`localStorage`(永久,同源共享,约 5MB 量级,仅字符串)、`sessionStorage`(标签页级)、Cookie(随请求发送、4KB 级)、IndexedDB(结构化、大容量、异步)。 为什么重要:离线能力、登录态、性能缓存都依赖它;选错存储会带来安全或容量问题。 怎么用:存对象先 `JSON.stringify`;敏感信息不放 `localStorage`(XSS 可直接读取);Cookie 设 `HttpOnly/Secure`;大批量数据用 IndexedDB。 常见误区:以为 `localStorage` 跨子域共享(实际按源隔离);同步 API 在主线程读写大对象会卡顿;隐私模式下可能抛异常,需 try/catch。 **15. 多媒体、图形与 HTML5 API(第21章、第22章)** 是什么:`