关于如何学好 JavaScript,我又写了一本书

简介: 我认识很多专业的前端小伙伴,我知道大家都能够在信息爆炸的碎片化时代,找到海量的 JavaScript 知识,可是找到它们,并不等于学会它们。对于很多人来说,如何掌握好 JavaScript 始终是一个困扰。即使看了多本名书,具备多年工作经验,可依然学不好它,甚至在学习了多年之后,对于基础知识存在许多盲区。

互联网时代,稀缺的不是知识,而是整合知识的方式。


我认识很多专业的前端小伙伴,我知道大家都能够在信息爆炸的碎片化时代,找到海量的 JavaScript 知识,可是找到它们,并不等于学会它们。对于很多人来说,如何掌握好 JavaScript 始终是一个困扰。即使看了多本名书,具备多年工作经验,可依然学不好它,甚至在学习了多年之后,对于基础知识存在许多盲区。


例如:


许多人无法准确理解引用数据类型,无法感知到它在内存中的区别会给我们的工作带来哪些困扰。


许多人无法理解闭包,他们能够大概表达出来闭包的定义,却不知道闭包在项目中是如何帮助我们完成大量的工作。甚至有少量的人还觉得闭包有害,认为闭包是 JavaScript 的设计缺陷。


许多人无法理解事件循环,没有认知到事件循环的重要意义,无法将事件循环与线程结合起来理解,不知道如何借助事件循环的机制达到性能优化的目的。


甚至很多人不理解函数,无法感知函数声明与函数执行的区别,没有想过函数声明与函数执行在内存中的不同表现,无法很好的利用函数完成一些难度看上去偏高的目标。

等等。


这些知识的相关文章,在网上并不难获取。只要学习过前端一段时间,大家多多少少都对它们有一定的理解,然而,也正是这些知识,阻碍了你更进一步。许多人在前端道路上的瓶颈,几乎都是由于缺乏知识整合的方式带来的。


如果有这么一本书,他介绍的所有内容,都依托于一种行之有效的知识整合方式,那么这本书,在当今时代,一定是一本非常稀缺的好书。


这就是《JavaScript 核心进阶》的核心进阶思路。


换一种说法,这种整合知识的方式,通常也被称之为知识体系。


1


什么是知识体系


知识体系,就是把分散且看上去独立的概念或者观点,加以整合,形成具有一定关联性的知识系统。


互联网时代,是一个信息爆炸的碎片化时代。我们每一个人,每一天都能够接触到非常多的知识。如果你打算自学前端,也能从网上找到海量的前端知识。


可你收集到的知识,不是以一个树状结构呈现给你,而是凌乱而分散的摆在你的面前。将这些知识,通过自己的理解,整合成为属于自己的知识体系,就变得非常困难。


这非常考验一个人的个人学习能力,而大多数人,不具备这样的能力。


于是,许多人自学前端,常常对掌握到的知识似懂非懂。你会有一种不知道这些知识学过来有什么用的困惑。这样的困惑,会让你怀疑自己是否真的掌握了这个知识。时间一久,你甚至会完全忘记它。你无法感知到自己的进步。


这正是因为,大家没有或者不知道如何去建立属于自己的知识体系,你没办法找到基础知识和实践之间的关联性。所以你感知不到这些知识存在的价值。


2


知识体系为什么很重要


我在很早之前,遇到了一个性能上的难题:仓库里有大量的商品,上亿件。需求是要计算出来所有商品的成本总价。 实现这个功能非常简单,每次计算时,只需要把所有商品的成本单价加起来,就是成本总价了。假设我们实现了一个 api,名为 getTotalPrice ,那么有如下伪代码


// 注意,这只是伪代码
function getTotalPrice() {
 // 1. 遍历数据库,查出所有的商品项及其单价
  const products = db.merchandise.get();
  // 然后,遍历products「上亿项数据」,将单价 price 相加,得出结果
  let total = 0
  // 循环,上亿项单价相加
  products.forEach(mer => {
    total += mer.price;
  })
  return total
}


问题就在于,仓库中的商品数量是随时变化的,每天都有大量的商品入库出库,也就意味着,商品的成本总价在不停的变化之中,与此同时,每天会有许多的用户会有查看商品成本总价的需求,如果这样的用户特别多的话,我们刚才定义的 getTotalPrice 方法就可能同时需要执行很多次。不停的重复计算在性能上的影响非常大,于是这种方案就变得不可取,那应该怎么办?


后来,我从 JavaScript 数组的 length 字段中找到了灵感。


我们先来了解一下关于 length 字段的基础知识。


数组提供了一个字段,length,用以访问数组的长度。这里我们要思考一个问题,首先,数组肯定是可以被改变的,我们可以调用 push 或者 pop 等方法来改变数组项的个数。可是为什么数组没有像我们刚才那样,提供一个 length() 方法去计算数组的长度,而是直接只提供了一个可以直接访问的 length 属性,而且这个 length 属性居然还能随时反应出正确的数组长度?


很显然,一定是做了额外的处理。


这个额外处理其实很简单,我们只需要在数组初始化时,使用 length 字段记录一次数组的长度。当数组改变「删除/新增」时,对应的去修改 length 的值就可以了。这样我们就能够随时访问到数组正确的 length,而不需要每次访问时,还要去调用一个函数计算一次。


同样的道理,对于仓库里商品的成本总价的管理,我们在仓库管理初始时,记录一次成本总价,以后每次入库,就在之前总价的基础上,加上本次入库的成本,每次出库,在之前的总价基础上,减去出库商品的成本,这样,我们就可以不用任何计算,直接得到仓库的成本总价。完美的解决了大量计算的性能问题。


一个看上去非常复杂的应用性能问题,而且还是后端数据库的解决方案,居然从最基础 JavaScript 数组的 length 属性上找到了灵感。


简直不可思议。


这就是知识体系的威力。他能够让我们拥有更强的问题解决能力。没有完善的知识体系,我想破脑袋,也不可能从最基础的 length 字段中找到解决方案。


除此之外,知识体系能够让你的学习能力得到巨大的提升。


至于为什么,这里把悬念留在后续的章节中,大家自行感受。


知识体系,能够帮助你不断佐证你所学的知识是否正确。我们在网上学到的许多知识,没有经历过权威认证,也许只是某个博主的个人所见,因此常常我们吸收到的知识会有所偏差。


例如一个重要的知识点,闭包。


许多人在这个点上出现严重的认知偏差。他们认为,闭包会造成内存泄漏,于是我们应该在实践中避免使用它,他们认为闭包是有害的。


而实际情况却是,我们很多实践场景,都在利用闭包达到我们想要的目的。闭包可以说是无处不在。


因为缺乏建立知识体系的思考过程,我们没有把闭包的基础理论,与实践结合起来理解,于是这个错误的认知,可能会伴随我们非常久的一段时间。而知识体系的完善,会帮助我们快速纠正我们的错误。


3


如何建立知识体系


知识体系的建立过程,是对知识融汇贯通的过程。也是不断审视自己的认知是否正确的过程。我们要在知识与知识之间,理论与理论之间,理论与实践之间,建立可靠的联系。

而在 JavaScript 这一个细分方向,如何建立知识体系,《JavaScript 核心进阶》用一整本书共72篇文章告诉我们答案。你值得一试!


世界上没有那么多天才,成功的背后,都是正确的学习方法和不懈的努力。

相关文章
N..
|
7月前
|
存储 JavaScript 前端开发
JavaScript基础知识
JavaScript基础知识
N..
53 1
|
6月前
|
存储 JavaScript 前端开发
Javascript基础知识
Javascript基础知识
46 1
|
3月前
|
JavaScript 前端开发 Java
JavaScript基础知识-this
关于JavaScript中this关键字的基础知识,通过比较其他编程语言如Python中的self参数来帮助读者理解。
31 1
JavaScript基础知识-this
|
存储 JavaScript 前端开发
一篇文章带你学完JavaScript基础知识,超全的JavaScript知识点总结
一篇文章带你学完JavaScript基础知识,超全的JavaScript知识点总结
291 3
一篇文章带你学完JavaScript基础知识,超全的JavaScript知识点总结
|
JavaScript 前端开发
自学javascript
自学javascript
48 0
|
JavaScript 前端开发
【javaScript】基础知识
最近抽了每天都抽出了一小小部分时间来学习javaScript简单将这几天学到的东西进行总结。
|
JavaScript 前端开发
【javaScript】基础知识续一
落下的东西始终是要补上的,欠下的始终是要还的,但是以后还是需要及时总结的好。
|
JSON JavaScript 前端开发
JavaScript的基础知识总结(3)
JavaScript的基础知识总结(2)
107 0
|
存储 JavaScript 前端开发
《JavaScript高级程序设计》__ 语言基础(下)
前言 大家好,我是HoMeTown,web领域有一本神书大家应该都有看过,这本书我看过两遍,但是每次看都是粗粗的略过一些重要的知识点,甚至一些面试过程中的问题,在这本书里都能找到答案。
173 0
|
JavaScript 前端开发