likes
comments
collection
share

【荐书】什么?!红宝书有第四版?

作者站长头像
站长
· 阅读数 1

前言

红宝书这个系列作为大部分前端的入门书籍之一,在一众前端心目中具有相当高的地位。在知道出来第四版没多久我就下单买了买了等于看了。 但是从购入到读完第一遍,中间磕磕绊绊的看了一个多月快两个月时间。从打算写这篇读书笔记到初稿也拖延大半个月才整出来。

【荐书】什么?!红宝书有第四版?

本着写读书笔记的心态把这段时间啃这本红砖的所见所得记录分享出来。本文会通过和上个版本的比较、推荐阅读顺序、优缺点这几块展开讨论。 顺便以有限的个人水平为大家提一些阅读建议~

与第三版差异 & 读前排雷

  1. 作者的不同,上一版由Nicholas c. Zakas 编写(主要开源作品&著作:ESlint、《JavaScript高级程序设计:第3版》、《深入浅出ES6》),由于前作者的身体问题(患了莱姆病),本版由Matt Frisbie编写;

  2. 相较于上一版本书的ES语法版本更新到了ES2019版本,即以ES6为主并且添加直到2019年TC39通过的新提案。书中部分案例中在使用新语法同时也会将旧语法拿出来比较;

  3. 结构排版会有些散碎,但整体上还是按照 ECMAScript -> BOM & DOM -> Web Api 这样的顺序作为全书的目录结构递进的;

  4. 少了高级技巧部分(上个版本第22章),这部分的知识打碎到书中其他章节里了;

  5. 作为刚出的新书的早期版次会带有一些印刷错误以及电子版和纸质版部分内容对不上的问题,前出版社也在整理读者们提交的勘误对再版书籍调整内容,相信之后的再版中出现的错误越来越少;

  6. 出版方出于防止盗版的原因,只把附录的内容放到电子版中,所以纸质版书籍是没有附录的;

  7. 翻译问题,对PromiseWeb Worker等词的中文翻译会让部分读者产生争议。(主要因为国家对出版物的要求下注明。);

2010年11月23日,国家新闻出版总署《关于进一步规范出版物文字使用的通知》明确要求:“外国人名、地名等专有名词和科学技术术语要按有关规定翻译成国家通用语言文字。“全国科学技术名词审定委员会(http://www.cnctst.cn/)是我国负责审定、公布、推广规范科技术语的机构,该委员会运维的“术语在线”(http://www.termonline.cn/)可供广大科技译者在线查询相关术语的规范译法。

阅读顺序建议

为什么要出个阅读顺序的建议?我们来看一下小红书目录(后面数字是对应页码)

1章 什么是JavaScript 1
2章 HTML中的JavaScript 11
3章 语言基础 21
4章 变量、作用域与内存 83
5章 基本引用类型 103
6章 集合引用类型 136
7章 迭代器与生成器 183
8章 对象、类与面向对象编程 205
9章 代理与反射 266
10章 函数 287
11章 期约与异步函数 322
12章 BOM 361
13章 客户端检测 382
14章 DOM 401
15章 DOM扩展 445
16章 DOM2和DOM3 460
17章 事件 490
18章 动画与Canvas图形 549
19章 表单脚本 581
20章 JavaScript API 609
21章 错误处理与调试 675
22章 处理XML 694
23章 JSON 703
24章 网络请求与远程资源 711
25章 客户端存储 751
26章 模块 772
27章 工作者线程 791
28章 最佳实践 842
附录A ES2018和ES2019(图灵社区下载)
附录B 严格模式(图灵社区下载)
附录C JavaScript库和框架(图灵社区下载)
附录D JavaScript工具(图灵社区下载)

其实对开发同时有阅读强迫症的童鞋来讲,开始接触比较厚技术类书籍是通过从头到尾硬读过去的。这样就会出现书太厚读到后面忘了前面,或者读了一些然后弃坑的情况(不排除有能硬吃的大佬)。所以这里提出的阅读建议是根据不同条件的同学,希望通过这个阅读顺序能帮助大家更有效率的从这本书中获取知识。

按照我当前的阅读体验来把这本书划分成如下几个模块:

【荐书】什么?!红宝书有第四版?

对零基础的初学者

老实说新版红宝书并不是很适合作为新手的第一本js教程,新手更推荐head first系列,图文并茂通俗易懂,或者选择犀牛书前10章作为入门读物:

第一阶段: 1 ~ 6 章(属于语言历史与语法基础,这里可以好好读,demo一定要跟着敲敲);

第二阶段: 7~11 章、15、16、20、21、26、28 (这部分就属于js初级进阶的部分了);

第三阶段: 12、14、17、23、24、25(完成这个阶段已经可以敲很多demo并且开发Web页面了);

有js基础的读者

方案1: 4 ~ 12 章(13选读)、 14 ~ 17 章(18、19选读)、 20、21、24、25、26、28 这个阅读顺序跳过了基础语法,上面没提到的其他章节可以大略翻一下;

需要加深核心知识理解,对新的特特征有所掌握的可以尝试方案2: 推荐精读:4、8、10、11、附录A/B。这几个部分比较系统的讲解了JavaScript 中两条重要的链——作用域链、继承链、闭包、面向对象编程、异步函数、严格模式等知识点。 选读:24章,这部分适合对网络请求的知识范围还在xhr没了解过fetch的同学;

有编程基础不会js的读者:

1 ~ 10章、20、11、24、28、26(其他部分选读);

接下来如果你想从事:

  • node方向的研究可以选读思维导图里的中高级概念、B/C网络请求&数据两个分支的章节;
  • web方向的研究可以选读浏览器、B/C网络请求&数据;

读后总结

惊艳点

惊艳点:我这么描述就是,当你看到之后就会有一种“值回票价”的感觉。

  1. 对象、类与面向对象编程这章提到很多类继承概念,并且把原型链的概念融入这个章节一起说,这是 通过proxy代理可以 自定义对象或者原型对象变化,随书视频demo中还有通过在数组实例添加代理的方式观察添加数组元素行为的例子
// 这个demo就很炫技,通过代理Array的实例,观察数组a的所有操作
var a = new Proxy([], Reflect.ownKeys(Reflect).reduce((handlers, key) => { 
    handlers[key] = (...args) => {          
      console.log(key, ...args)
      return Reflect[key](...args)      
    }   
    return handlers  
}, {}))  
a.push(1)

/**
get [] push []
get [] length []
set [] 0 1 []
getOwnPropertyDescriptor [] 0
defineProperty [] 0 { value: 1, writable: true, enumerable: true, configurable: true }  
set [ 1 ] length 1 [ 1 ]
getOwnPropertyDescriptor [ 1 ] length
defineProperty [ 1 ] length { value: 1 }
*/

(另外提一嘴,这个特性目前还没法在小程序上灵活使用 详见

  1. 8.4.4中讲类混入模式里使用的案例reduce混入 + 异步操作的案例非常简洁优雅;
class Vehicle {}

let FooMixin = (Superclass) => class extends Superclass {
  foo() {
    console.log('foo');
  }
};
let BarMixin = (Superclass) => class extends Superclass {
  bar() {
    console.log('bar');
  }
};
let BazMixin = (Superclass) => class extends Superclass {
  baz() {
    console.log('baz');
  }
};

function mix(BaseClass, ...Mixins) {
  return Mixins.reduce((accumulator, current) => current(accumulator), BaseClass);
}
//从这里可以窥探出大佬的编程思路和技巧,能学到就是赚到

class Bus extends mix(Vehicle, FooMixin, BarMixin, BazMixin) {}

let b = new Bus();
b.foo();  // foo
b.bar();  // bar
b.baz();  // baz
  1. 书中后半部分h5 api/xml/json的章节相对于上一版本做了解耦,更方便阅读;

  2. 在异步函数中对await + promise 情况的执行顺序有很好的Demo来描述;

// 异步打印"foo"
async function foo() {
  console.log(await Promise.resolve('foo'));
}
foo();
// foo
 
 
// 异步打印"bar"
async function bar() {
  return await Promise.resolve('bar');
}
bar().then(console.log);
// bar

// 1000毫秒后异步打印"baz"
async function baz() {
  await new Promise((resolve, reject) => setTimeout(resolve, 1000));
  console.log('baz');
}
baz();
// baz(1000毫秒后)

整体知识结构的质量不愧于‘红宝书’的头衔。

缺憾
  1. 异步编程章节本身的案例相当精彩,章节里promise、async/await的案例如果能结合事件循环的概念一起串讲会让知识点更连贯。另外promise部分讲的很碎,(这一部分的暂时阅读建议是,promise的运行周期(pending、fullfill状态)、resolve/rejected、then/catch/finally 、all/race async await 标识符的使用,其他可用选读)

  2. proxy 如果能够结合实例工具或者框架去分析会更好一些;

  3. 与前作、犀牛书一样,上下文与作用域与this的关系没有一套系统的描述;

最后

感谢你读到最后,那么关于我对红宝书第四版的分享就到这里

进阶阅读建议下面这几本

如果我的文章对您有帮助,可以给我点个赞,嘻嘻 ~