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