易燃物汇聚 YouTube 有声书与书评
JavaScript权威指南(原书第7版) 封面

JavaScript权威指南(原书第7版)

[美]大卫·弗拉纳根

1479人在读
39.6万字总字数
¥83定价

内容简介

书介绍JavaScript语言和由浏览器与Node实现的JavaScript API。本书适合有一定编程经验、想学习JavaScript读者,也适合已经在使用JavaScript但希望更深入地理解进而真正掌握这门语言的程序员。本书的目标是全面地讲解JavaScript语言,对JavaScript程序中可能用到的重要的客户端API和服务器端API提供深入的介绍。本书篇幅较长,内容非常详尽,相信认真研究本书的读者都能获益良多。

读者书评

★★★★★

本来要下载pdf的,结果发现微信读书有,果断来看。先大致看一遍,熟悉基本语法,跟python很像;然后根据自己需求一步一步查询与编写,再加上现在有AI,大大缩短了学习难度。

★★★★★

21年的时候买的这本书,挺推荐的,因为像《C++ Primer》一样,会告诉你最有价值的文字内容。每天一两个小时拿出来学习,啃了接近半年,那时刚来到学校,算是回忆了。

★★★★★

全面系统的学完了这么语言,对这门语言有了新的理解。现在正是最好的学习时代,遇到不懂的可以问AI,但是系统的学习也是必不可少的。

★★★★★

第六版是 2012 年发布,没有 ES6 特性。第七版更新了。

★★★★★

O'reilly的书质量都挺高,讲解比较系统,讲了JS的各个方面。系统解说的另一面就是也会比较啰嗦,读者可以把这本书当成工具书,根据需要阅读相关章节。在实际项目中,理解js的各种框架会更有帮助。

★★★★★

《JavaScript权威指南(原书第7版)》的一大优势是严谨性,对概念的定义精准且深入,比如原型链、闭包等难点,不仅解释“是什么”,更剖析“为什么”,搭配大量代码示例帮助理解。同时,它平衡了理论与实践,既讲解语言规范,又结合浏览器API、Node.js等实际场景,适合从入门到进阶的各阶段开发者。 不过,其厚重的篇幅和偏学术的叙述风格,对新手可能稍显晦涩,需耐心精读。整体而言,它既是初学者构建知识体系的权威手册,也是资深开发者备查的实用工具书,是JavaScript学习者值得反复研读的经典之作。 下面是我总结的笔记,自己会时常打开复习,感兴趣的书友也可以看下: 第1章:JavaScript简介 - 语言定位:JavaScript是一门跨平台、动态、弱类型的编程语言,核心标准为ECMAScript(由TC39委员会制定),主要运行环境包括浏览器(客户端)和Node.js(服务器端)。 - 核心组成: - ECMAScript:定义语言基础(语法、类型、函数、对象等)。 - DOM(文档对象模型):浏览器提供的操作HTML/XML文档的API(如节点增删、属性修改)。 - BOM(浏览器对象模型):浏览器提供的与窗口交互的API(如导航、历史记录、定时器)。 - 版本演进:从ES5(2009)到ES6/2015(重大更新,新增类、模块、箭头函数等),再到ES2020及后续版本(逐步完善异步、类型增强等特性),强调“向后兼容”原则。 - 应用场景:网页交互、服务器开发(Node.js)、桌面应用(Electron)、移动应用(React Native)等。 第2章:词法结构 - 字符集:基于Unicode(支持多语言字符),大小写敏感( name 与 Name 是不同标识符)。 - 标识符规则: - 由字母、数字、 $ 、 _ 组成,不能以数字开头。 - 不能使用关键字(如 if 、 function )或保留字(如 class 、 enum )。 - 注释: - 单行注释: // 注释内容 (从 // 到行尾)。 - 多行注释: /* 注释内容 */ (不可嵌套,常用于块级说明)。 - 分号与自动分号插入(ASI): - 语句通常以分号结尾,ASI会在特定场景自动补充分号(如换行处),但可能导致意外(如 return 后换行,会被解析为 return; ),建议显式添加分号。 - 直接量(字面量):代码中直接表示的值,如 42 (数字)、 "hello" (字符串)、 {} (对象)、 /abc/ (正则)等。 第3章:类型、值和变量 - 数据类型: - 原始类型(7种): -  number :整数、浮点数(64位双精度,存在精度问题,如 0.1 + 0.2 !== 0.3 )、特殊值( NaN 非数字、 Infinity 无穷大)。 -  string :字符序列(单/双引号或反引号包裹,反引号支持多行和模板字符串  ${} )。 -  boolean : true / false 。 -  null :表示“空值”(唯一值, typeof null === 'object' 是历史bug)。 -  undefined :表示“未定义”(变量声明未赋值时的默认值)。 -  symbol (ES6+):唯一且不可变的标识符(通过 Symbol() 创建,可作为对象属性的唯一键)。 -  bigint (ES2020+):表示任意精度整数(后缀 n ,如 123n ,可与同类型运算)。 - 对象类型:复杂数据结构(引用类型),包括普通对象、数组、函数、日期等,存储的是内存地址。 - 变量声明: -  var :函数作用域,存在变量提升(声明提升到作用域顶部,赋值保留原位),可重复声明。 -  let :块级作用域( {} 内有效),无变量提升,存在“暂时性死区”(声明前不可使用),不可重复声明。 -  const :块级作用域,声明时必须赋值,且值不可修改(对象/数组的属性可改,因存储的是引用)。 - 类型转换: - 隐式转换:运算或比较时自动发生(如 "5" == 5  →  true , "5" + 3  →  "53" )。 - 显式转换: - 转数字: Number(x) 、 parseInt(x) (整数)、 parseFloat(x) (浮点数)。 - 转字符串: String(x) 、 x.toString() ( null / undefined 不可用)。 - 转布尔: Boolean(x) ( falsy值: 0 、 "" 、 null 、 undefined 、 NaN ,其余为truthy)。 第4章:表达式与操作符 - 表达式:由操作符和操作数组成,能产生值(如 a + b 、 obj.prop 、 fn() )。 - 操作符分类及要点: - 算术运算符: + (加/字符串拼接)、 - 、 * 、 / (除法)、 % (取余)、 ** (幂运算,如 2**3=8 )、 ++ (自增)、 -- (自减)。 - 注意: + 遇到字符串则优先拼接(如 1 + "2" = "12" )。 - 比较运算符: -  === (严格相等,类型+值均相同)、 !== (严格不等)。 -  == (宽松相等,会类型转换,如 null == undefined  →  true ,但 null == 0  →  false )。 - 逻辑运算符: && (与,短路:左为falsy则返回左值,否则返回右值)、 || (或,短路:左为truthy则返回左值,否则返回右值)、 ! (非,返回布尔值)。 - 条件运算符: condition ? expr1 : expr2 (三目运算,可嵌套)。 - 赋值运算符: = 、 += 、 -= 等(如 a += b 等价于 a = a + b )。 - 其他重要操作符: -  typeof :返回值的类型字符串(如 typeof 42 === 'number' , typeof null === 'object' )。 -  instanceof :判断对象是否为某个构造函数的实例(如 [] instanceof Array → true )。 -  in :判断属性是否存在于对象中(如 'name' in {name: 'a'} → true )。 - 可选链 ?. (ES2020+):安全访问嵌套属性(如 obj?.prop ,若 obj 为 null/undefined 则返回 undefined ,避免报错)。 第5章:语句 - 条件语句: -  if...else : if(condition) { ... } else if(condition2) { ... } else { ... } 。 -  switch : switch(expr) { case value: ...; break; default: ... } ,注意 case 匹配用 === ,需加 break 避免穿透。 - 循环语句: -  for : for(init; condition; update) { ... } (适合已知循环次数)。 -  while : while(condition) { ... } (先判断后执行)。 -  do...while : do { ... } while(condition) (先执行后判断,至少执行一次)。 -  for...in :遍历对象的可枚举属性(包括原型链,不推荐遍历数组,因可能遍历非数字索引)。 -  for...of (ES6+):遍历可迭代对象(数组、字符串、 Map 、 Set 等)的元素值(推荐遍历数组)。 - 跳转语句: -  break :退出当前循环或 switch 。 -  continue :跳过当前循环的剩余部分,进入下一次循环。 -  return :从函数中返回值,终止函数执行。 -  throw :抛出异常(需配合 try...catch 处理)。 - 异常处理: try { ... } catch(err) { ... } finally { ... } ( finally 无论是否异常都会执行,常用于释放资源)。 第6章:对象 - 对象特性:无序的键值对集合,键为字符串或 symbol ,值为任意类型(原始值或对象)。 - 创建方式: - 对象字面量: const obj = { name: 'Alice', age: 20 } (最常用)。 - 构造函数: const obj = new Object() (不推荐,不如字面量简洁)。 -  Object.create(proto) :创建以 proto 为原型的对象(如 Object.create(null) 创建无原型的对象)。 - 属性操作: - 访问: obj.prop (点语法,键为合法标识符)或 obj['prop'] (方括号语法,支持动态键,如 obj[varKey] )。 - 新增/修改: obj.newProp = value (直接赋值)。 - 删除: delete obj.prop (删除属性,返回 true ,但不能删除继承的属性)。 - 属性特性(Descriptor): - 通过 Object.defineProperty(obj, prop, { ... }) 配置: -  value :属性值。 -  writable :是否可修改(默认 true )。 -  enumerable :是否可枚举( for...in 、 Object.keys() 是否包含,默认 true )。 -  configurable :是否可删除或修改特性(默认 true ,一旦设为 false 则不可再改)。 -  get / set :存取器函数(替代 value 和 writable ,实现属性的读写逻辑)。 - 原型与继承: - 每个对象有 __proto__ (非标准,推荐用 Object.getPrototypeOf() )指向其原型对象。 - 访问属性时,先查自身,再查原型链,直至 null (原型链终点)。 - 常用方法: Object.getPrototypeOf(obj) 、 Object.setPrototypeOf(obj, proto) 、 obj.hasOwnProperty(prop) (判断属性是否为自身所有)。 第7章:数组 - 特性:有序集合(索引为0开始的整数),长度动态可变( array.length 可直接修改),属于特殊对象( typeof [] === 'object' )。 - 创建方式: - 数组字面量: const arr = [1, 2, 3] (最常用)。 - 构造函数: new Array(3) (创建长度为3的空数组,注意 new Array(1, 2) 等价于 [1,2] )。 - 类数组转数组: Array.from(likeArray) (如 Array.from(document.querySelectorAll('div')) )。 - 核心方法: - 增删改: -  push(...items) :尾部添加,返回新长度。 -  pop() :尾部删除,返回删除项。 -  unshift(...items) :头部添加,返回新长度。 -  shift() :头部删除,返回删除项。 -  splice(start, deleteCount, ...addItems) :从 start 开始删除 deleteCount 项,插入新项,返回删除的数组。 - 遍历/转换: -  forEach((item, index) => { ... }) :遍历,无返回值。 -  map((item) => item * 2) :映射,返回新数组。 -  filter((item) => item > 0) :过滤,返回符合条件的新数组。 -  reduce((acc, item) => acc + item, initial) :累加,返回最终结果(可用于求和、扁平化数组等)。 -  find((item) => item.id === 1) :返回第一个符合条件的项。 - 其他: -  slice(start, end) :截取 [start, end) 的子数组(不修改原数组)。 -  concat(arr2, arr3) :拼接数组,返回新数组。 -  sort((a, b) => a - b) :排序(默认按字符串排序,需传比较函数)。 -  join(',') :将元素转为字符串并拼接(默认用 , 分隔)。 - 稀疏数组:包含空槽( empty )的数组(如 [1,,3] ), forEach 、 map 等方法会跳过空槽。 第8章:函数 - 定义方式: - 函数声明: function fn(x) { return x * 2; } (存在函数提升,可在声明前调用)。 - 函数表达式: const fn = function(x) { ... } (赋值给变量,无提升,需先声明后调用)。 - 箭头函数(ES6+): const fn = (x) => x * 2 (无 this 、 arguments ,不能作为构造函数,适合短逻辑)。 - 参数与返回值: - 参数:支持默认值( function fn(x=0) { ... } )、剩余参数( function fn(...args) { ... } ,收集多余参数为数组)、参数解构( function fn({name}) { ... } )。 - 返回值: return 语句指定返回值,无 return 则默认返回 undefined ; return 后不能有换行(否则被ASI补分号,返回 undefined )。 - 函数特性: - 一等公民:可作为参数传递、作为返回值、赋值给变量。 - 作用域:函数作用域( var )或块级作用域(ES6+的 let / const ),嵌套函数可访问外层作用域(闭包)。 -  this 指向(普通函数): - 全局调用:指向全局对象(浏览器 window ,Node.js  global ,严格模式下 undefined )。 - 对象方法调用:指向调用对象( obj.fn() 中 this 为 obj )。 -  new 调用:指向新创建的实例。 -  call / apply / bind :显式指定 this ( fn.call(obj, 1, 2) 、 fn.apply(obj, [1,2]) 、 fn.bind(obj) 返回新函数)。 - 闭包:函数保留对定义时作用域的访问(即使脱离原作用域),可用于实现私有变量(如计数器、模块化)。 第9章:类 - 类的定义(ES6+): class 是原型继承的语法糖,更贴近传统面向对象语法。 class Person { constructor(name) { // 构造函数,实例化时调用 this.name = name; } sayHi() { // 实例方法(挂载到原型) return `Hi, ${this.name}`; } static create(name) { // 静态方法(挂载到类本身,可通过类调用) return new Person(name); } }   - 继承:通过 extends 实现,子类用 super() 调用父类构造函数。 class Student extends Person { constructor(name, grade) { super(name); // 必须先调用super()才能使用this this.grade = grade; } }   - 特性: - 私有属性(ES2022+):用 # 前缀(如 #age ),仅类内部可访问。 - getter/setter: get name() { ... } 、 set name(val) { ... } ,用于封装属性访问。 - 类不存在提升,需先定义后使用。 第10章:使用正则表达式的模式匹配 - 正则语法: /pattern/flags , pattern 为匹配规则, flags 为修饰符( i 忽略大小写、 g 全局匹配、 m 多行模式、 u Unicode模式、 y 粘连模式)。 - 元字符与规则: - 字符类: [abc] (匹配a/b/c)、 [^abc] (非a/b/c)、 \d (数字 [0-9] )、 \w (单词字符 [A-Za-z0-9_] )、 \s (空白字符)。 - 量词: * (0+次)、 + (1+次)、 ? (0/1次,非贪婪匹配)、 {n} (n次)、 {n,} (n+次)、 {n,m} (n到m次)。 - 位置匹配: ^ (行首)、 $ (行尾)、 \b (单词边界,如 \bcat\b 匹配独立的“cat”)、 \B (非单词边界)。 - 分组与引用: (pattern) (捕获分组,可通过 \1 、 \2 引用第n个分组结果)、 (?:pattern) (非捕获分组,仅用于分组不捕获)。 - 正向/反向预查: (?=pattern) (正向肯定预查,如 \d+(?=元) 匹配“100元”中的“100”)、 (?!pattern) (正向否定预查)、 (?<=pattern) (反向肯定预查)、 (?<!pattern) (反向否定预查)。 - RegExp对象: - 创建:字面量 /abc/g 或构造函数 new RegExp('abc', 'g') (动态生成正则时用后者)。 - 方法: test(str) (返回是否匹配, g 模式下会更新 lastIndex )、 exec(str) (返回匹配结果数组,含分组, g 模式下可循环获取所有匹配)。 - 字符串方法: -  str.match(regex) :无 g 时返回匹配数组(含分组),有 g 时返回所有匹配项数组。 -  str.replace(regex, replacement) :替换匹配内容, replacement 可用 $1 引用分组(如 str.replace(/(\w+)\s(\w+)/, '$2 $1') 交换两个单词)。 第11章:JavaScript标准库 - 内置对象与函数: - 全局对象:浏览器中为 window ,Node.js中为 global ,包含全局函数( eval 、 isNaN 、 parseInt 等)和构造函数( Object 、 Array 等)。 - Math:数学工具,方法如 Math.random() (随机数0-1)、 Math.floor() (向下取整)、 Math.ceil() (向上取整)、 Math.max(...nums) (最大值)。 - Date:处理日期时间, new Date() 获取当前时间,方法如 getFullYear() 、 toLocaleString() (本地时间字符串)、 getTime() (时间戳,毫秒数)。 - Error及子类: Error (通用错误)、 SyntaxError (语法错误)、 ReferenceError (引用错误)、 TypeError (类型错误)、 RangeError (范围错误),可自定义错误 class MyError extends Error { ... } 。 - JSON:处理JSON数据, JSON.stringify(obj) (对象转JSON字符串)、 JSON.parse(str) (JSON字符串转对象),注意 undefined 、函数、Symbol在 stringify 中会被忽略。 - 集合类型(ES6+): -  Map :键值对集合(键可为任意类型,而非仅字符串),方法 set(key, val) 、 get(key) 、 has(key) 、 delete(key) 、 size 属性。 -  Set :无序不重复元素集合,方法 add(val) 、 has(val) 、 delete(val) 、 size 属性,可用于数组去重( [...new Set(arr)] )。 -  WeakMap / WeakSet :弱引用集合,键为对象,不阻止垃圾回收,适合临时关联数据(如缓存DOM元素信息)。 第12章:迭代器和生成器 - 迭代器(Iterator): - 定义:实现 next() 方法的对象, next() 返回 { value: 当前值, done: 是否完成 } 。 - 可迭代对象:实现 [Symbol.iterator]() 方法(返回迭代器)的对象,如数组、字符串、 Map 、 Set ,可被 for...of 遍历。 - 自定义迭代器: const iterator = { count: 0, next() { return this.count < 3 ? { value: this.count++, done: false } : { done: true }; } };   - 生成器(Generator): - 定义:函数名前加 * ,内部用 yield 暂停执行,返回生成器对象(既是迭代器也是可迭代对象)。 - 用法: function* generator() { yield 1; yield 2; return 3; } const gen = generator(); gen.next(); // { value: 1, done: false } gen.next(); // { value: 2, done: false } gen.next(); // { value: 3, done: true }   - 特性: yield* 可委托给其他迭代器(如 yield* [1,2,3] ),支持双向通信( gen.next(val) 可向生成器传值)。 第13章:异步编程 - 回调函数:早期异步方案,将后续逻辑作为参数传入异步函数(如 setTimeout(fn, 1000) ),缺点是嵌套过深(“回调地狱”)。 - Promise(ES6+): - 状态: pending (进行中)→  fulfilled (成功)或 rejected (失败),状态一旦改变不可再变。 - 方法: -  Promise.resolve(val) / Promise.reject(err) :快速创建已决议的Promise。 -  then(onFulfilled, onRejected) :处理成功/失败,返回新Promise(可链式调用)。 -  catch(onRejected) :捕获错误(等价于 then(null, onRejected) )。 -  finally(onFinally) :无论成功失败都执行(不接收参数)。 - 静态方法: Promise.all([p1, p2]) (所有成功才成功,返回结果数组;一个失败则失败)、 Promise.race([p1, p2]) (第一个完成的结果决定最终状态)。 - async/await(ES2017+): - 语法: async 函数内用 await 等待Promise决议,使异步代码看起来像同步。 - 特点: await 后必须是Promise, async 函数返回值自动包装为Promise,错误可用 try...catch 捕获。 - 示例: async function fetchData() { try { const res = await fetch('url'); const data = await res.json(); return data; } catch (err) { console.error(err); } }   第14章:元编程 - 元编程:编写能操作代码本身的代码(如动态修改对象行为、拦截操作)。 - Proxy(ES6+): - 作用:创建对象的代理,拦截并自定义对象的基本操作(如属性访问、赋值、删除等)。 - 语法: new Proxy(target, handler) , handler 是包含拦截方法的对象(如 get 、 set 、 deleteProperty )。 - 应用:数据校验(拦截 set 检查值合法性)、日志记录、实现响应式(如Vue 3的响应式原理)。 - Reflect(ES6+): - 作用:提供一组操作对象的方法(与 Proxy 的拦截方法对应),如 Reflect.get(target, prop) 、 Reflect.set(target, prop, val) 。 - 优势:返回操作结果(布尔值),支持函数式调用,更规范地操作对象。 - 其他元编程特性: -  Object.getOwnPropertyDescriptors(obj) :获取对象所有属性的描述符。 -  Symbol 的内置值(如 Symbol.iterator 定义迭代器、 Symbol.toStringTag 自定义 Object.prototype.toString 结果)。 第15章:Web浏览器中的JavaScript - 浏览器宿主环境: - 全局对象: window (包含 document 、 location 、 history 等子对象)。 - 代码执行: <script> 标签嵌入或引入外部脚本,加载顺序影响执行顺序( defer / async 控制异步加载)。 - DOM操作: - 文档结构: document 是根节点,包含 documentElement ( <html> )、 body ( <body> )。 - 节点查找: document.getElementById(id) 、 document.querySelector(selector) (返回第一个匹配元素)、 document.querySelectorAll(selector) (返回所有匹配元素的类数组)。 - 节点操作: document.createElement(tag) (创建元素)、 parent.appendChild(child) (添加子节点)、 parent.removeChild(child) (删除子节点)、 node.cloneNode(deep) (克隆节点, deep 为 true 则克隆子节点)。 - 属性与样式: element.getAttribute(attr) / element.setAttribute(attr, val) 、 element.style (操作行内样式)、 element.classList (操作类名,如 add 、 remove 、 toggle )。 - 事件处理: - 事件流:捕获阶段(从根到目标)→ 目标阶段 → 冒泡阶段(从目标到根)。 - 绑定事件: element.addEventListener(type, handler, { capture: false }) ( capture 为 true 则在捕获阶段触发)。 - 事件对象: event 包含事件信息( target 触发元素、 preventDefault() 阻止默认行为、 stopPropagation() 阻止冒泡)。 - 常见事件: click (点击)、 input (输入)、 load (页面加载完成)、 scroll (滚动)、 resize (窗口大小变化)。 - BOM(浏览器对象模型): -  window.location : href (完整URL)、 pathname (路径)、 reload() (刷新页面)。 -  window.history : back() / forward() (前进后退)、 pushState(state, title, url) (无刷新修改URL,用于SPA路由)。 - 定时器: setTimeout(handler, delay) (延迟执行)、 setInterval(handler, interval) (定时重复执行)、 clearTimeout(id) / clearInterval(id) (清除定时器)。 第16章:使用Node进行服务器端JavaScript开发 - Node.js特性:基于V8引擎,非阻塞I/O模型(适合高并发),事件驱动,单线程(通过事件循环处理异步操作)。 - 模块系统:采用CommonJS规范, - 导出: module.exports (默认导出)或 exports (快捷方式,不能直接赋值为新对象)。 - 导入: require(path) (导入模块,路径可为相对路径、绝对路径或核心模块名)。 - 核心模块: fs (文件系统)、 http (HTTP服务器)、 path (路径处理)、 events (事件模块)。 - 核心API: -  fs 模块: fs.readFile(path, (err, data) => {}) (异步读文件)、 fs.writeFile(path, data, (err) => {}) (异步写文件),同步方法加 Sync 后缀(如 fs.readFileSync )。 -  http 模块:创建HTTP服务器, const http = require('http'); http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello World'); }).listen(3000);   - 事件模块: EventEmitter 类(自定义事件, on 绑定事件、 emit 触发事件),如 stream 、 http 模块均基于此。 - 异步编程:回调函数是基础,也支持Promise和 async/await (需Node.js 7.6+),常用工具库如 util.promisify (将回调函数转为Promise)。 第17章:JavaScript工具和扩展 - 开发工具: - 代码编辑器:VS Code(支持ESLint、Prettier等插件)、WebStorm。 - 构建工具:Webpack(模块打包)、Vite(快速开发服务器)、Rollup(库打包)。 - 包管理:npm、yarn、pnpm(管理依赖包)。 - 测试工具:Jest(单元测试)、Cypress(端到端测试)。 - 语言扩展: - TypeScript:添加静态类型的JS超集,编译为JS执行,增强代码健壮性和可维护性。 - Flow:Facebook的静态类型检查工具,可在JS中添加类型注解进行检查。 - 实战示例:书中以一个完整的“待办事项”应用为例,展示从需求分析、代码设计到使用工具构建的全流程,涵盖模块化、DOM操作、事件处理、本地存储( localStorage )等综合知识点。 通过这些工具和扩展,可提升开发效率、代码质量,并适配大型项目的复杂需求。

书籍信息

作者[美]大卫·弗拉纳根
译者李松峰
出版社机械工业出版社
出版时间2021-03-17
ISBN9787111677222
分类计算机-编程设计
格式EPUB
完结状态连载中
章节数176