互聯(lián)網(wǎng)時代,稀缺的不是知識,而是整合知識的方式

世界上沒有那么多天才,成功的背后,都是正確的學(xué)習(xí)方法和不懈的努力。

互聯(lián)網(wǎng)時代,稀缺的不是知識,而是整合知識的方式。

我認(rèn)識很多專業(yè)的前端小伙伴,我知道大家都能夠在信息爆炸的碎片化時代,找到海量的 JavaScript 知識,可是找到它們,并不等于學(xué)會它們。對于很多人來說,如何掌握好 JavaScript 始終是一個困擾。即使看了多本名書,具備多年工作經(jīng)驗,可依然學(xué)不好它,甚至在學(xué)習(xí)了多年之后,對于基礎(chǔ)知識存在許多盲區(qū)。

例如:

許多人無法準(zhǔn)確理解引用數(shù)據(jù)類型,無法感知到它在內(nèi)存中的區(qū)別會給我們的工作帶來哪些困擾。

許多人無法理解閉包,他們能夠大概表達(dá)出來閉包的定義,卻不知道閉包在項目中是如何幫助我們完成大量的工作。甚至有少量的人還覺得閉包有害,認(rèn)為閉包是 JavaScript 的設(shè)計缺陷。

許多人無法理解事件循環(huán),沒有認(rèn)知到事件循環(huán)的重要意義,無法將事件循環(huán)與線程結(jié)合起來理解,不知道如何借助事件循環(huán)的機(jī)制達(dá)到性能優(yōu)化的目的。

甚至很多人不理解函數(shù),無法區(qū)分函數(shù)聲明與函數(shù)執(zhí)行的區(qū)別,沒有想過函數(shù)聲明與函數(shù)執(zhí)行在內(nèi)存中的不同表現(xiàn),無法很好的利用函數(shù)達(dá)到一些難度看上去偏高的目標(biāo)。

等等。

這些知識的相關(guān)文章,在網(wǎng)上并不難獲取。只要學(xué)習(xí)過前端一段時間,大家多多少少都對它們有一定的理解,然而,也正是這些知識,阻礙了你更進(jìn)一步。許多人在前端道路上的瓶頸,幾乎都是由于缺乏知識整合的方式帶來的。

如果有這么一本書,他介紹的所有內(nèi)容,都依托于一種行之有效的知識整合方式,那么這本書,在當(dāng)今時代,一定是一本非常稀缺的好書。

這就是《JavaScript 核心進(jìn)階》的核心進(jìn)階思路。

換一種說法,這種整合知識的方式,通常也被稱之為知識體系。

1

什么是知識體系

知識體系,就是把分散且看上去獨立的概念或者觀點,加以整合,形成具有一定關(guān)聯(lián)性的知識系統(tǒng)。

互聯(lián)網(wǎng)時代,是一個信息爆炸的碎片化時代。我們每一個人,每一天都能夠接觸到非常多的知識。如果你打算自學(xué)前端,也能從網(wǎng)上找到海量的前端知識。

可你收集到的知識,不是以一個樹狀結(jié)構(gòu)呈現(xiàn)給你,而是凌亂而分散的擺在你的面前。將這些知識,通過自己的理解,整合成為屬于自己的知識體系,就變得非常困難。

這非??简炓粋€人的個人學(xué)習(xí)能力,而大多數(shù)人,不具備這樣的能力。

于是,許多人自學(xué)前端,常常對掌握到的知識似懂非懂。你會有一種不知道這些知識學(xué)過來有什么用的困惑。這樣的困惑,會讓你懷疑自己是否真的掌握了這個知識。時間一久,你甚至?xí)耆浰D銦o法感知到自己的進(jìn)步。

這正是因為,大家沒有或者不知道如何去建立屬于自己的知識體系,你沒辦法找到基礎(chǔ)知識和實踐之間的關(guān)聯(lián)性。所以你感知不到這些知識存在的價值。

2

知識體系為什么很重要

我在很早之前,遇到了一個性能上的難題:倉庫里有大量的商品,上億件。需求是要計算出來所有商品的成本總價。實現(xiàn)這個功能非常簡單,每次計算時,只需要把所有商品的成本單價加起來,就是成本總價了。假設(shè)我們實現(xiàn)了一個 api,名為 getTotalPrice ,那么有如下偽代碼

// 注意,這只是偽代碼
function getTotalPrice() {
    // 1. 遍歷數(shù)據(jù)庫,查出所有的商品項及其單價
  const products = db.merchandise.get();
  
  // 然后,遍歷products「上億項數(shù)據(jù)」,將單價 price 相加,得出結(jié)果
  let total = 0
  
  // 循環(huán),上億項單價相加
  products.forEach(mer => {
    total += mer.price;
  })
  
  return total
}

問題就在于,倉庫中的商品數(shù)量是隨時變化的,每天都有大量的商品入庫出庫,也就意味著,商品的成本總價在不停的變化之中,與此同時,每天會有許多的用戶會有查看商品成本總價的需求,如果這樣的用戶特別多的話,我們剛才定義的 getTotalPrice 方法就可能同時需要執(zhí)行很多次。不停的重復(fù)計算在性能上的影響非常大,于是這種方案就變得不可取,那應(yīng)該怎么辦?

后來,我從 JavaScript 數(shù)組的 length 字段中找到了靈感。

我們先來了解一下關(guān)于 length 字段的基礎(chǔ)知識。

數(shù)組提供了一個字段,length,用以訪問數(shù)組的長度。這里我們要思考一個問題,首先,數(shù)組肯定是可以被改變的,我們可以調(diào)用 push 或者 pop 等方法來改變數(shù)組項的個數(shù)。可是為什么數(shù)組沒有像我們剛才那樣,提供一個 length() 方法去計算數(shù)組的長度,而是直接只提供了一個可以直接訪問的 length 屬性,而且這個 length 屬性居然還能隨時反應(yīng)出正確的數(shù)組長度?

很顯然,一定是做了額外的處理。

這個額外處理其實很簡單,我們只需要在數(shù)組初始化時,使用 length 字段記錄一次數(shù)組的長度。當(dāng)數(shù)組改變「刪除/新增」時,對應(yīng)的去修改 length 的值就可以了。這樣我們就能夠隨時訪問到數(shù)組正確的 length,而不需要每次訪問時,還要去調(diào)用一個函數(shù)計算一次。

同樣的道理,對于倉庫里商品的成本總價的管理,我們在倉庫管理初始時,記錄一次成本總價,以后每次入庫,就在之前總價的基礎(chǔ)上,加上本次入庫的成本,每次出庫,在之前的總價基礎(chǔ)上,減去出庫商品的成本,這樣,我們就可以不用任何計算,直接得到倉庫的成本總價。完美的解決了大量計算的性能問題。

一個看上去非常復(fù)雜的應(yīng)用性能問題,而且還是后端數(shù)據(jù)庫的解決方案,居然從最基礎(chǔ) JavaScript 數(shù)組的 length 屬性上找到了靈感。

簡直不可思議。

這就是知識體系的威力。他能夠讓我們擁有更強(qiáng)的問題解決能力。沒有完善的知識體系,我想破腦袋,也不可能從最基礎(chǔ)的 length 字段中找到解決方案。

除此之外,知識體系能夠讓你的學(xué)習(xí)能力得到巨大的提升。

至于為什么,這里把懸念留在后續(xù)的章節(jié)中,大家自行感受。

知識體系,能夠幫助你不斷佐證你所學(xué)的知識是否正確。我們在網(wǎng)上學(xué)到的許多知識,沒有經(jīng)歷過權(quán)威認(rèn)證,也許只是某個博主的個人所見,因此常常我們吸收到的知識會有所偏差。

例如一個重要的知識點,閉包。

許多人在這個點上出現(xiàn)嚴(yán)重的認(rèn)知偏差。他們認(rèn)為,閉包會造成內(nèi)存泄漏,于是我們應(yīng)該在實踐中避免使用它,他們認(rèn)為閉包是有害的。

而實際情況卻是,我們很多實踐場景,都在利用閉包達(dá)到我們想要的目的。閉包可以說是無處不在。

因為缺乏建立知識體系的思考過程,我們沒有把閉包的基礎(chǔ)理論,與實踐結(jié)合起來理解,于是這個錯誤的認(rèn)知,可能會伴隨我們非常久的一段時間。而知識體系的完善,會幫助我們快速糾正我們的錯誤。

3

如何建立知識體系

知識體系的建立過程,是對知識融匯貫通的過程。也是不斷審視自己的認(rèn)知是否正確的過程。我們要在知識與知識之間,理論與理論之間,理論與實踐之間,建立可靠的聯(lián)系。

而在 JavaScript 這一個細(xì)分方向,如何建立知識體系,《JavaScript 核心進(jìn)階》用一整本書共72篇文章告訴我們答案。你值得一試!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容