過去幾年我注意到技術圈一個很奇怪的現象,有太多程序員將那些他們只是有過非常淺顯的了解, 但其實根本就不懂的技術寫到他們的簡歷中,這個現象幾乎每種語言都有,但這其中最嚴重的就要數javascript了。
你不知道你不懂
出現這種狀況的一個很大的原因就是現如今幾乎每個開發者的工作都或多或少要依賴于javascript, 但大多數人并不真的理解這門語言,他們常用的學習方式是復制粘貼,使用這種方式, 你永遠不會真正學會這門語言,而只能得到一個你已經懂了的假象。
根據我過去幾年學習和使用javascript的經驗,在你了解之前,你不會知道你其實不懂, 這聽起來有點繞,你真正需要的就是有個人來告訴你你其實不懂,你需要全面系統的學習。 我經常面試一些自豪的將javascript列在他們簡歷中的家伙,但他們通常也就只能做個簡單的onClick處理或是表單驗證。 使用jQuery或者Dojo這樣的框架當然沒什么問題,但是除非你能了解隱藏在這些框架之后的javascript技術, 否則你不可能真正的掌握這些工具包的能量所在,下面就是我劃分的從低到高的javascript知識點, 分為基礎,中級和高級3個部分,看看你知道多少:
javascript的基礎知識
- 知道基本的編程語法,比如循環,判斷,try/catch等等 * 理解包括多種函數定義以及賦值的方式,包括匿名函數
- 理解基本的命名空間,全局(window)空間以及對象空間(不包括閉包)
- 理解上下文的角色以及this變量的使用 * 理解各種對象以及函數的初始化和聲明方式
- 理解javascript比較操作符,如<, >, ==, ===,以及對象和字符串比較的原理和對象映射 * 理解對象屬性和函數的數組索引,以及這和真實的數組之間的區別。
javascript中級知識
* 理解定時器,以及它的工作原理,包括何時以及如何使用定時器來異步執行方法調用
- 關于回調的深度支持,以及如何通過call和apply
方法來控制上下文和函數參數傳遞
- 理解JSON標記以及eval函數 * 理解閉包以及他們如何影響你的代碼效率
- AJAX以及對象序列化
javascript高級知識點
- 理解方法的”arguments’變量,包括如何使用它來通過arguments.length重載函數,以及通過arguments.callee來進行遞歸調用,需要注意使用這個特性有一定的危險性,因為ECMAScript 5 的Strict模式不支持此功能,但jQuery和Dojo都用到了它。
- 高級閉包比如 self-memoizing函數,partially applied函數,以及最可愛的 (function(){})()調用。
- 函數以及HTML prototype,prototype chain,以及如何使用基本的javascript對象和函數(比如Array)來簡化代碼。
- 對象類型以及instanceof的使用 * 正則表達式和表達式編譯
- With語句以及為什么不要使用它們 * 最困難的部分,知道如果利用所有這些工具,并產生處干凈,整潔,健壯,快速,可維護以及兼容不同瀏覽器的代碼。
這里的最后一點特別重要并且也是最難實現的,因為javascript天生不夠嚴格的語法, 你的程序很容易就會變成意大利面條式的難以維護的災難代碼,一旦你開始學習javascript語言本身, 你只能通過在大型的Web程序中不斷實踐才能真正掌握它,這可能要花好幾年的時間, 并且你沒法從書本上學到這些,我自己每天使用javascript好幾小時,已經好幾年了, 但我還是在不斷尋找更好的方式來編寫和重構我的代碼,出于這個原因,一開始就使用jQuery這樣的框架會很危險, 它會很容易讓你的代碼變得不可維護,Dojo的Class和Package系統則多少會幫上點忙。
考慮到javascript現在已經通過Node.js這樣的項目滲透到了后端,我決定將和Web相關的部分單獨拉出來講講, 也就是說,如果你想要在Web開發中使用javascript,那么下面這些就是每一個優秀程序員都應該了解的:
- 如何高效的操作Dom(添加,刪除以及更新),還有如何通過使用document fragments這樣的工具來最小化瀏覽器的re-flows。
- 夸瀏覽器的DOM元素屬性提取(比如,style,position等等),jQuery和Dojo都可以很好的完成這些工作,盡管如此,理解從CSS和style標簽中提取屬性的差異,以及如何計算position和size還是很重要的。
- 夸瀏覽器的事件處理,綁定,反綁定,冒泡,以及如何取得期望的回調上下文。在一次,現成的框架也可以很好的處理這些事情,但是你應該對IE瀏覽器和W3C標準瀏覽器之間的不同有所了解。
- 正則表達式選取DOM節點 * 瀏覽器功能檢測以及智能降級
就像你從上面的列表中看到的,對于javascript,除了alert(myval)或者myBtn.οnclick=…, 你還需要了解更多東西,這些都是粘貼復制無法學到的,只有通過閱讀和練習, 你才能成為一名真正的javascript程序員。
這里推薦兩本關于javascript的好書,”the good parts”和”javascript忍者的秘密”, 如果你只是為了裝飾簡歷,我建議你至少也要搞懂基礎階段的那些知識點,并且至少嘗試過中極階段的那些技術。 一旦你發現當你開始自己開發你想要的功能,而不是從其他人那里拷貝粘貼時,你就可以宣稱自己懂javascript了, 在那之前,請先別這樣說。
如果我錯過了什么關于javascript的概念,歡迎給我留言,同時也別忘了分享任何你關于JS或者其它語言的經驗。
需要說明的是我并不是一個前端開發者,我實際上是一個后臺開發者,但是因為形勢需要, 漸漸變成了一個全協議棧的開發者,現如今,幾乎每個后端開發者都需要了解javascript, 這也是我寫這篇文章的目的,我并不是想表達我對javascript有多了解, 我只是想說javascript是一門非常強大和龐雜的語言,它遠比你第一眼看到的要復雜。
本文翻譯自”You Don’t Know javascript”(http://www.w2lessons.com/2011/04/you-dont-know-javascript.html), 作者:Michael Woloszynowicz(http://twitter.com/mwbiz)。