一個只花了天就開發完成的腳本語言自從誕生開始就一直成為人們爭論的焦點盡管這樣它在編程語言中地位仍然無法動搖全世界有幾百萬學習者和粉絲而本文的作者認為JavaScript設計之匆忙初衷僅僅實現簡單的網頁互動JavaScript繼承完全缺乏設計指導等所以他認為JavaScript仍然較差
最近我和許多程序員一樣對JavaScript進行重新探討事實上JavaScript是一個非常有能力的語言但使用新JavaScript一年後我得出的結論卻是JavaScript仍然很爛我並不是在討論其古怪的比較運算而是從更深的層次去思考與此同時還會提供一些解決方案供你選擇
直奔主題
歲時父親送給我第一本編程書籍JavaScript初學者編程讓我興奮的是我發現電腦並不單單是由電線和發條所組成裡面的代碼清晰明了我覺得我基本上理解它了實際上也差不多終究代碼除了人類理性思想的形式化還能是什麼?
說實話我當時希望遇到的是Java我甚至在谷歌上搜索JavaScript和Java是同一種語言嗎?當然不是所以Java成為了我學習的第二門語言不過我母親和繼父不希望在家庭電腦裡安裝軟件所以我無法安裝Java編譯器我清晰地記得在把代碼上傳到一個在線編譯器之前得反復檢查代碼然後等待下載jar包……
我當時認為JavaScript是一個非常嚴肅的語言在Notepad裡新建一個HTML文件然後在IE裡打開就這樣開始了沒有類沒有私有和公有方法沒有final變量當時我甚至不知道什麼叫過度設計但它准確地描述了我印象中的Java:
● 無需編譯
● 無處不在的開發平台
● 沒有高級語言特性
● 查看源文件
為什麼這麼偉大的語言還會討人厭?
Adhoc地獄
下面是一些問題設計之匆忙初衷僅僅實現簡單的網頁互動JavaScript繼承完全缺乏設計指導一切都是adhoc:
沒有OOP:JavaScript確實存在基本的對象模型但幾乎無人知道它是如何工作的
沒有標准庫從論壇上復制粘貼代碼不好玩
沒有模塊系統不斷查找下載鏈接和很長的源文件
缺乏語言資源沒有高品質的資源(幾乎沒有一本像樣的書籍)意味著你只能從論壇或博客上獲得一些非官方的參考
既然JavaScript有這麼多缺陷到底是什麼讓它如此流行?
復興
JavaScript崛起的背後可能與谷歌V引擎息息相關JavaScript突然變得很快真正地快速所以人們開始硬著頭皮使用它來編寫Web應用程序
然而Nodejs推出了一些更吸引人的基准允許代碼在客戶端和服務器端重用很像Meteor和Derby因此情況開始好轉
下載按鈕變得更大
Nodejs 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=; i<arrlength; 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發布了自己JavaScript或前者是在年半之前發布的且不向後兼容但並無人使用且永遠不會有同樣也適用於後者
ECMAScript Harmony最近由於設計委員會的原因發布新版ECMAScript將會有一個極其緩慢和痛苦的過渡過程特別是它有一些特效是與JavaScript不兼容的沒有解決方案除非你願意再等數十年
下面列出一些可選項
CoffeeScript語法非常漂亮且支持類我認為CoffeeScript並未結束只不過是剛剛華麗地開啟
TypeScript一種編譯到JavaScript的語言可以在JavaScript中構建並且添加了靜態類型個人而言我是它的大粉絲正如Mohamed Mansour和Dave Hodder在評論中指出的那樣TypeScript正在進一步實施ECMAScript的一些建議也許ECMAScript最終會從TypeScript中借鑒可選的靜態類型
Google Dart一個全新的語言附帶JavaScript編譯器和一些JavaScript互操作但整體上並未整合到JavaScript生態系統中
HaXe這是一個高級語言可以編譯JavaScriptFlashNekoVMPHPC++C#和Java(不久後)雖然我從未使用過但它真的令人印象深刻
總結
最後我敢押注最終的獲勝者肯定是編譯為JavaScript的語言雖然我們還沒真正准備好這樣的過渡但是所取得的進展仍是有目共睹的盡管也存在些偏離但他們正在替未來的Web發展鋪平道路不管最終哪門語言會勝出我都想強調一下我的主要觀點JavaScript目前仍然存在許多不足我們需要擁抱一個新語言並且推進它
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19347.html