发布于 2026-01-05 0 阅读
0

读书会:《雄辩的JavaScript》——第一章

读书会:《雄辩的JavaScript》——第一章

我最近参加了一个前端开发岗位的技术面试。这家公司专注于网络安全技术,但他们正在寻找 React 开发人员,为客户创建更好的用户界面仪表盘。

我原本以为面试会问一些算法方面的问题,或许会聊聊 JavaScript 数据结构或优化。结果,面试官提出的问题却让我大吃一惊。什么是原型继承? 你能从根本上解释一下 Promise 是什么吗? 函数声明和函数表达式之间有什么区别

我当时的第一反应是:他们的代码库得有多简单啊?!我还以为这家公司在招 React 开发人员呢!现在我明白了,他们是在寻找合格的前端工程师,而不是那种能快速搭建一个 Next 应用然后吹嘘自己懂静态代码生成的人。他们需要的是真正掌握了基础知识的工程师。这些基础知识可以帮助他们解决 JavaScript 生态系统中任何复杂的 bug。这就是精通这门语言的魅力所在。

任何框架中的所有错误信息都源于某些东西与 JavaScript 的运行方式不兼容。然而,JavaScript 非常复杂。那么,JavaScript 的工作原理是什么呢?

面试进行得不太顺利。

我意识到自己对 JavaScript 的运作原理有了大致的了解,但却难以解释其基本概念,原因很简单,我从未深入了解过 JavaScript引擎的内部运作。这对我来说是一次宝贵的学习经历;我不想因为自己知识的匮乏而感到沮丧或懊恼。相反,我把这次经历当作学习的契机。我渴望能够回答这些问题。我一直很喜欢探究底层原理;现在是时候认真地将精力投入到这门开启我职业生涯的语言上了。

我想成立一​​个读书俱乐部。首先是为了我自己,或许也为了你,亲爱的读者。我在网上(以及我那尘封已久的书架上)搜寻了一本关于 JavaScript 的最新权威教材。我决定从备受推崇的《Eloquent JavaScript》入手。而且,我之前也粗略翻阅过这本书,作者 Marijn Haverbeke 的文笔非常出色。

一开始我有点忐忑,因为以我目前的职业发展阶段来说,这本书的内容可能太基础了。如果一开始就解释什么是琴弦,我很快就会失去兴趣。不过,写这篇文章的时候,我读到的内容让我惊喜不已。

这篇文章将重点讨论第一章。本系列文章将以我的笔记和观察为主,主要围绕我之前不了解的 JavaScript 内容展开。我强烈建议你亲自阅读这本书。它是免费的,适用于大多数设备,并且可能涵盖了你入门这门语言以及编程所需的所有知识。

第一章

在机器表面之下,程序在运转。它毫不费力地扩张和收缩。电子以极高的和谐度散射和重组。显示器上的图像不过是水面上的涟漪。其本质则隐匿于无形之下。

  • 袁马大师,《编程之书》

数字与记忆

在 JavaScript 中处理类型会消耗内存。如果需要将值存储在变量(或作者所称的绑定)中,这些变量就需要占用计算机空间。在典型的现代计算机中,我们有超过 300 亿比特的易失性工作内存(即 RAM)。而像 SSD 或硬盘这样的非易失性存储设备,其容量则要大得多。

JavaScript 的数字类型使用固定位数的位,即 64 位来存储一个数值。这很神奇,因为乍一看,64 位似乎并不多。但当你开始理解位的概念后,就会意识到这意味着我们有大约2^642 的 64 次方个可能的数字。这相当于大约 18 万亿亿种选择。

那可真是个庞然大物。处理海量数字时,问题往往层出不穷。我们不妨来谈谈地球上所有的沙粒。如果我们把这些沙粒的数量存储在一个变量中,我们仍然会有大约十万亿亿比特的剩余空间,可以做任何我们想做的事情。

需要注意的是,负数需要用额外的比特来表示-符号,非整数(例如浮点数)也需要考虑。即使考虑到所有这些因素,整数的组合仍然有 9 万亿种。可惜的是,这还不足以存储所有的沙粒……

运算符和类型

我们有单变量运算符,而不仅仅是双变量运算符。双变量运算符类似于 `+` 5 + 3,其中加号可以接受两个值。单变量运算符只接受一个值;因此得名。`+`typeof是一个返回值类型的单变量运算符。

只有一个三元运算符,叫做条件运算符。你可能以前见过它:true ? 1 : 2

null`undefined`和 ` undefinednull` 都是比较特殊的类型。作者说它们可以互换使用,而且本质上是一样的。我并不完全同意,因为我认为 ` undefinedundefined` 表示以后可能存在的值,而 `null` 则表示该值不存在。如果可以的话,我更倾向于使用 `undefined`,但最好还是尽可能地确保类型安全。作者还提到:

undefined 和 null 之间的含义差异是 JavaScript 设计上的偶然现象,而且大多数情况下并不重要。

稍加探究后,我在 Stack Overflow 的一篇文章中找到了这样一段话,对这起事故做了更详细的解释。

摘自《面向 Web 开发人员的专业 JS》(Wrox 出版社):“你可能会疑惑,为什么 typeof 运算符对于 null 值会返回 'object'。这实际上是最初 JavaScript 实现中的一个错误,后来被复制到了 ECMAScript 中。如今,人们认为 null 是对象的占位符,即使从技术上讲,它是一个原始值。”

  • 理智船长(好名字)

JavaScript 中也存在自动类型转换:

console.log(8 * null);
// → 0 (null is converted to 0)
console.log('5' - 1);
// → 4 ('5' becomes 5)
console.log('5' + 1);
// → 51 (1 becomes '1')
console.log('five' * 2);
// → NaN (can't use *, /, or - on strings)
console.log(false == 0);
// → true (false becomes 0)
Enter fullscreen mode Exit fullscreen mode

一个小技巧是,如果你发现自己犯了错误NaN,请记住,对 进行进一步的算术运算会NaN不断产生NaN,所以要检查你可能在哪里进行了任何意外的类型转换。

最好使用严格相等运算符===,因为它可以精确地测试值是否相等,并避免自动类型转换。

第一章结束

就是这样!随着我逐渐熟悉写章节回顾的节奏,希望我也能学会把笔记串联起来。目前,我的笔记有点杂乱无章。但我希望你们至少能学到一些东西。如果有什么地方不清楚,请告诉我,我可以尝试进一步解释。或者,你们也可以点击这里访问作者的网站,查看第一章。

你读过这一章吗?这本书呢?请在评论区告诉我你的想法,以及你是否认为这是一本真正掌握 JavaScript 基础知识的好书。

下一章将重点讲解程序结构。我们刚刚学习了钉子,现在让我们掌握如何使用锤子。

最初发布在我的个人网站上,网址是alex.kharo.uk

文章来源:https://dev.to/kharouk/book-club-eloquent-javascript-chapter-one-5c0d