JavaScript:世界上最被誤解的語言
JavaScript:世界上最被誤解的程式語言
作者:道格拉斯·克羅克福德(Douglas Crockford) 翻譯:Bumphy
正文
JavaScript,也叫Mocha,LiveScript,JScript,ECMAScript,是世界上最受歡迎的程式語言之一。事實上,世界上每個人的個人電腦上至少安裝了一種JavaScript的直譯器,並且被廣泛地使用著。JavaScript如此受歡迎的原因在於它在全球資訊網中所扮演的指令碼語言的角色。
名字
Java這個字首的暗示使得人們總會把JavaScript和Java聯絡起來,認為JavaScript是Java的一個子集或者是一個功能差於Java的一個版本。似乎JavaScript這個名字就是有意造成一種混淆,而這種混淆帶來了後來的誤解。JavaScript不被解釋成Java,Java就是Java。而JavaScript則是另一種不同的程式語言。
JavaScript的語法和Java相類似,這就像Java和C類似一樣。但是,JavaScript並不是Java的一個子集就像Java不是C的子集。JavaScript在應用程式方面比Java(Oak)當初所打算的表現地更好。
JavaScript並不是在Java的誕生地——Sun Microsystems公司,被開發出來的,而是在Netscape(網景)被開發出來的。它最初被叫做LiveScript,而這個名字並沒有讓人們很迷惑。
Script這個字尾的暗示,說明JavaScript不是一種真正的“程式語言”,作為一門指令碼語言和程式語言相比,還是有差距的。但是,這的確是一個專業化的問題。和C語言相比,JavaScript通過犧牲效能而換取更加豐富的表達能力和動態性。
披著 C 外衣的 Lisp
JavaScript的類 C 語法,包括花括號和笨重的for語句,使得它看起來更像是一種普通的過程式的語言。這是一種誤導,因為和C 或 Java相比,JavaScript 和 函式式語言——比如 Lisp 和 Scheme,有著更多的相似之處。它用陣列代替列表,用物件代替屬性列表。函式是第一型別,函式可以有閉包。你不需要去平衡所有的這些圓括號,就可以使用匿名函式。
語言型別定型
JavaScript最初的設計是執行在Netscape Navigator上的。它的成功使它事實上成為了所有網頁瀏覽器的標準配置。這就造成了語言型別的定型。可以說,JavaScript就是程式語言中的 George Reeves(注:美國演員,因扮演“超人”出名,導致被定型,而無法接演其他角色)。JavaScript也適用於很多和網頁無關的應用程式。
變動的(語言設計)目標
JavaScript的第一個版本相當的弱。它缺少異常處理、內部函式、繼承。就它現在的形式而言,它已經是一門完整的面向物件的程式語言了。但是,針對這門語言的很多觀點都是基於它不成熟的形式而引發的。
負責管理這門語言的ECMA委員會正在開發擴充套件,這本是出於好意,但是這也加劇了一個更大的問題:版本變得越來越多。而這造成了更多的困擾。
設計錯誤
沒有任何程式語言是完美的。JavaScript也有它本身設計錯誤,比如過載表示相加和附帶型別轉換的串連線兩個含義,易錯的with語句也應該避免使用。保留字策略過於嚴格。分號的嵌入也是一個巨大的錯誤,正則表示式的符號也是一樣。這些錯誤會導致程式設計錯誤,同時將語言的設計作為一個整體質疑。幸運地是,這些問題中的很多問題可以用一個非常不錯的 Lint 程式來緩和。
這個語言的設計整體上是相當健全的。令人驚訝地是,ECMAScript委員會似乎對於糾正這些錯誤並不感興趣。也許,他們對創造一個新的語言更感興趣吧。(注:這裡應該是作者的調侃語)。
糟糕的實現
JavaScript早期的一些實現可謂是錯誤百出。這一點反映在語言上。更糟糕地是,這些實現被嵌入到了更加錯誤百出的web瀏覽器之中。
糟糕的參考書籍
幾乎所有關於JavaScript的書籍都相當地糟糕。它們充滿了錯誤,不恰當的例子,和沒什麼幫助的練習。這門語言中的重要特性被糟糕地解釋,或者被完全忽略。我修訂過很多關於JavaScript的書籍,但是我只推薦一本:《JavaScript權威指南(第五版)》——作者:David Flanagan。(作者語:如果你寫了一本很好的書,請給我郵遞一本贈閱本。)
不合格的標準
JavaScript的官方規範是由ECMA出版的。這個官方規範的質量相當的低。而且難以閱讀和理解。這是一個造成拙劣書籍問題的一個原因,因為作者們無法使用標準文件來提升他們對語言的理解。ECMA和TC39委員會應該為此感到深深地窘迫和不安。
業餘愛好者
很多使用JavaScript的人並不是程式設計師。他們缺乏專業素質和編寫優秀程式的訓練。無論如何,JavaScript擁有如此強大的表現力,以致於他們通過使用JavaScript可以做很多有意義的事情。這就讓JavaScript背上了一個名聲,就是說,JavaScript完全是給業餘人員設計的語言,它不適合用於專業程式設計。其實,事實並非如此。
面向物件
JavaScript是面向物件的嗎?它擁有物件,它的物件可以包含資料和處理資料的方法。物件中可以包含其他的物件。它沒有類,但是它有建構函式,通過建構函式可以做類似於類的操作,包括充當類變數和方法的容器。它沒有面向類的繼承,但是它有面向原型的繼承。
建立物件體系的兩個主要方式分別是通過繼承和通過聚合。JavaScript兩個方法都有,但是它的動態性使得它可以在聚合的基礎上變得更加優秀。
一些爭論認為JavaScript不是一門真正的面向物件,因為它不支援(提供)資訊的隱藏。也就是說,物件不能擁有私有變數和私有方法:所有的成員都是公共的。
但是又有證明顯示,JavaScript中的物件可以有私有變數和私有方法。(注:原文中,作者這裡是一個連結,介紹關於物件私有變數和私有方法的文件)當然,很少有人理解這一點,因為JavaScript是世界上最被誤解的程式語言。(注:作者這裡使用了一種輕鬆的調侃方式)。
一些爭論認為JavaScript不是一門真正的面向物件,因為它不支援繼承。但是這又被證明JavaScript不僅能支援傳統的繼承還能應用其它的程式碼複用模式。(注:原文這裡仍然是一個連結)
版權2001年道格拉斯Crockford。版權所有Wrrrldwide。
關於作者:
Douglas Crockford是JavaScript的Yoda,領袖級人物。一句話介紹,他寫了《JavaScript: The Good Parts》(中文譯為:《JavaScript語言精粹》),並且是JSON、JSLint、JSMin和ADSafe的創造者。
- 後記,吐槽,網上的一些翻譯好爛,作為一名手藝人,還是要去讀原文,至少可以更加接近原作者的寫作原意。