重思JavaScript的JavaScript
最近,我和許多程序員一樣,對JavaScript進行重新探討。事實上,JavaScript是一個非常有能力的語言,但使用新JavaScript一年后,我得出的結論卻是JavaScript仍然很爛。我并不是在討論其古怪的比較運算。而是從更深的層次去思考。與此同時,還會提供一些解決方案供你選擇。
直奔主題
13歲時,父親送給我第一本編程書籍——JavaScript初學者編程。讓我興奮的是,我發現電腦并不單單是由電線和發條所組成,里面的代碼清晰明了。我覺得我基本上理解它了,實際上也差不多。終究,代碼除了人類理性思想的形式化還能是什么?
說實話,我當時希望遇到的是Java,我甚至在谷歌上搜索:“JavaScript和Java是同一種語言嗎?”當然不是。所以Java成為了我學習的第二門語言,不過我母親和繼父不希望在家庭電腦里安裝軟件,所以我無法安裝Java編譯器。我清晰地記得,在把代碼上傳到一個在線編譯器之前,得反復檢查代碼,然后等待、下載jar包……
我當時認為,JavaScript是一個非常嚴肅的語言。在Notepad里新建一個HTML文件,然后在IE里打開,就這樣開始了。沒有類、沒有私有和公有方法,沒有final變量。當時,我甚至不知道什么叫“過度設計”,但它準確地描述了我印象中的Java:
- 無需編譯
- 無處不在的開發平臺
- 沒有高級語言特性
- 查看源文件
為什么這么偉大的語言還會討人厭?
Ad-hoc地獄
下面是一些問題:設計之匆忙、初衷僅僅實現簡單的網頁互動、JavaScript繼承完全缺乏設計指導,一切都是ad-hoc:
- 沒有OOP:JavaScript確實存在基本的對象模型,但幾乎無人知道它是如何工作的。
- 沒有標準庫:從論壇上復制粘貼代碼不好玩。
- 沒有模塊系統:不斷查找下載鏈接和很長的源文件。
- 缺乏語言資源:沒有高品質的資源(幾乎沒有一本像樣的書籍)意味著你只能從論壇或博客上獲得一些非官方的參考。
既然JavaScript有這么多缺陷,到底是什么讓它如此流行?
復興
JavaScript崛起的背后可能與谷歌V8引擎息息相關。JavaScript突然變得很快,真正地快速。所以人們開始硬著頭皮使用它來編寫Web應用程序。
然而,Node.js推出了一些更吸引人的基準,允許代碼在客戶端和服務器端重用,很像Meteor和Derby。因此,情況開始好轉:
- 下載按鈕變得更大
- Node.js kind of sort of standardized an import system
- 人們可以編寫更好的庫
- 優秀的資源開始出現
然而:
- 仍然沒有采用OOP
- 客戶端和服務端的JavaScript仍然沒有關聯
- 文檔甚至是高知名度項目文檔也很糟糕
為什么?
我認為現代JavaScript仍然較爛的根源是其處在一個特定的社區氛圍中,該氛圍一直強調:JavaScript是一門非常好的語言,但卻一直被人誤解。不,JavaScript只是一個提早誕生且沒有先例可循的語言。停止包庇并且開始把JavaScript作為一個平臺去擁抱,作為一個編譯目標。
文檔
人們可以盡情嘲笑Java,但當我看Java文檔時,我可以非常明確地知道哪個對象可以創建、每個方法里的參數、需要拋出的異常等。最好的事情莫過于使用JavaScript庫作為精選示例代碼。這幾乎是不可能寫出正確的軟件,除非你閱讀庫源碼。甚至連如此完整的JavaScript項目Express也存在令人生厭的API文檔(Ember他們那些非常優秀的API文檔可能是反例)。
語法糖
JavaScript社區很快就拋棄了語法糖。語法糖是極富創造力的。將重復邏輯代碼抽象出來,可以通用,幫助程序員以更好的方式編寫代碼。
- 讓代碼更加簡潔
- 有助于表達代碼背后的意思,而不是算法。我已經知道了數組迭代算法,好吧,謝謝你,但是請你不要告訴我這些,我只想知道你要做的東西。
作為一名編碼人員,你的主要觀眾不是電腦,而是其他程序員,也包括將來的自己。書寫冗長的for循環很爽,但說實話,for (var i=0; i<arr.length; i++)與for e in arr 比起來,人們更愿意讀后者。順便說一下,這里的JavaScript版的循環比CoffeeScript速率要慢,你知道為什么嗎?
JSLint
如果程序員使用JavaScript尚未感到痛苦,那JSLint成功做到了這點,而且非常“成功”! 想象一下,在某個編碼的新兵訓練營里,想要對JavaScript進行尷尬的懲罰,然后在其身上進行拔毛,這好比是拿著牙刷在刷廁所。事實上,我寧愿從牦牛身上拔毛。這是原文中的例子,小編的理解是JSLint的出現是給JavaScript挑刺的,而這樣還不如直接在JavaScript身上拔毛。
更值得注意地是,作為程序員,我們應該尋找自動化,難道你不希望自己可以自動化JSLint嗎?當然,你可以。CoffeeScript可以***的生成linted代碼,正如Jeremy。
OOP
JavaScript對象模型還是不夠成熟,原型(Prototype)繼承是一個低級別的功能,可以創建一些非常有意義的對象模型,但卻無法基于本身進行構建。
這也可能是JavaScript API為什么會那么糟糕的原因,當你所使用的語言甚至沒有類時,該如何記錄面向對象代碼呢? 最重要的是,當我們甚至不知道實例化對象時,JavaScript開發人員該如何實行互操作?
有什么可選項嗎?
年復一年,筆記本逐步成為主流、政壇也發生了不少的變化,而JavaScript仍然保持不變。你愿意等一些基本特性多少年?在這篇悲觀論調的文章里,讓我們先看看下面這個列表:
- Mozilla發布了自己JavaScript1.7或1.8,前者是在6年半之前發布的,且不向后兼容,但并無人使用且永遠不會有,同樣也適用于后者。
- ECMAScript Harmony。最近,由于設計委員會的原因,發布新版ECMAScript將會有一個極其緩慢和痛苦的過渡過程,特別是它有一些特效是與JavaScript不兼容的。沒有解決方案,除非你愿意再等數十年。
下面列出一些可選項
- CoffeeScript語法非常漂亮且支持類。我認為CoffeeScript并未結束,只不過是剛剛華麗地開啟。
- TypeScript一種編譯到JavaScript的語言,可以在JavaScript中構建并且添加了靜態類型。個人而言,我是它的大粉絲。正如Mohamed Mansour和Dave Hodder在評論中指出的那樣,TypeScript正在進一步實施ECMAScript的一些建議,也許ECMAScript最終會從TypeScript中借鑒可選的靜態類型。
- Google Dart一個全新的語言,附帶JavaScript編譯器和一些JavaScript互操作,但整體上并未整合到JavaScript生態系統中。
- HaXe這是一個高級語言,可以編譯JavaScript、Flash、NekoVM、PHP、C++、C#和Java(不久后),雖然我從未使用過,但它真的令人印象深刻。
總結
***,我敢押注,最終的獲勝者肯定是編譯為JavaScript的語言。雖然我們還沒真正準備好這樣的過渡,但是所取得的進展仍是有目共睹的。盡管也存在些偏離,但他們正在替未來的Web發展鋪平道路。不管最終哪門語言會勝出,我都想強調一下我的主要觀點:JavaScript目前仍然存在許多不足,我們需要擁抱一個新語言并且推進它。