對於現代開發來說,JavaScript就是一種垃圾語言

蔡蔡發表於2013-10-31

伯樂線上導讀:昨天 Reddit/Programming 頻道的頭條熱帖是一篇來自 julik live 博主的技術吐槽文,最初的英文標題是“For modern development Javascript indeed is a shit language”。該文在Reddit得分是800+,引發了熱評(930+評論)。感謝@蔡volvo蔡 的熱情翻譯,以下是譯文。

 

我很抱歉,但 Crockford 就是堅持這麼寫的(I’m sorry, but the Crockford arguments do not cut it.)

Javascript在很多方面都爛透了,而且還極其無趣,我就納了悶了,大家為啥都義無返顧,群情激奮的跳進Node學習的大軍裡,是!Node是比Ruby快,Node是基於事件模型處理的,但讓我無法理解的是,一些人動不動就想把自己的程式用Node重構一下,過過腦子行嗎!

Javascript的繼承,深拷貝問題,不是定義一個新ECMA標準就能解決的,不是套個漂亮的語法外殼(比如CoffeeScript)就能搞定的,不是用require實現個標準化或者引入classes就可以萬事大吉的,ECMA語言裡不是有個引入classes的ActionScript嗎!那玩意跟Javascript一樣屎,只要大家繼續用它,PHP框架的現狀就是JS的未來— 一堆一堆的人前赴後繼,日以繼夜的為這坨屎一樣的語言搭框架、寫工具。

我來說一下為什麼Javascript糟糕,當然了,它也有好的方面。 但是問題就是太不實用。比如說原型繼承(prototypal inheritance)就限制頗多-因為這玩意說白了就是function override,還有就是那句:“萬物皆function” 也是相當的廢柴-因為一function不是一個物件,也不能當做資料機構來承載資料。

其實真正的吐槽才剛剛開始,隨便列幾個吧:

 

JS的呼叫屬性

看這個屎一樣的設計,回顧過去,我們們很難苛責語言的設計人員,因為它們可能處於效能考慮,再者,如果不習慣訊息-傳遞機制的語言的話,你會覺得怎麼”一些屬性可以被呼叫而另外一些就不可以呢“!

雜湊物件對於stable 鍵不可用

物件和雜湊的混合不是一個好點子,因為它違反了物件可以擁有metadata的前提,metadata允許我們建立基本型別系統或者至少各種型別的introspection

函式物件對於型別系統不可用 因為一個物件不攜帶任何型別資訊

這可是大事,Ruby的世界裡也是這樣,感覺所有的東西都在像鴨子一樣快樂的嘎嘎叫,我們經常用Object$class 來獲取物件資訊,下面是給HTML元素加樣式的標準的流程:

在JS裡是不可能的,因為只有’Object’,’function’和原始型別才有型別資訊

到處是Null

不小心用錯了一個常量

任何事情都不會發生,因為物件是hashes,而且js給常量預設為0。 帶著錯誤key的常量將會是undefined,而且還會滲透到被呼叫函式中,等出了事,慢慢跟蹤debug去吧

回撥的深淵

JS缺少合適的deferred功能,不是多執行緒,就得靠事件化執行,你的呼叫會散落在各個事件回撥中,程式碼都完事了,回撥還在那執行呢,比如,JS幹下面這個是就費勁

因為你在等一個結果,就在等待的這會,runtime完全可以進行事件處理、DOM重繪、幹啥都行

res.name // this will be only executed once res is available 等res可以使用的時候在去執行res.name的操作

當然了,JS社群做了跟PHP社群一直以來一樣的事情-給Javascript這坨屎擦屁股,怎麼擦呢?用更多的回撥,好點的,就是回撥鏈

一般情況下,加入一個wait primitive就在獲取結果的等待過程中控制events,

專業一點的做法就是啥玩意我們都非同步,現實是你寫的程式碼80%都是同步的,因為程式裡80%乾的都是一個操蛋的事情跟另外一個操蛋的事情一起搞,而且你需要它倆都它媽的完事了才行。

可怕的異常處理機制

異常處理在JS中機器可怕,一般形式-你可以檢視呼叫堆疊(一堆匿名函式和好點的名字的函式),你可看到錯誤資訊,我就提兩個經常碰到的錯誤:

這都拜javascript中“函式對(泥煤)象”所賜,根本沒有方法定義-它們只有屬性,JS執行時永遠沒有辦法知道函式物件有沒有方法可以被呼叫,或者某個屬性名稱 – 它就認為你的雜湊鍵不存在,

我記得Ruby社群裡的人抱怨Ruby的回溯和錯誤訊息機制不好用,Rubinius就給解決了,在泥煤的javascript裡,你知道錯誤訊息特別亂嗎?因為有你想得到和使用的兩個最最基本,最最重要的異常NameError和NoMethodError 都可能,這在其它語言裡都是不能理解的,但javascript語言就這麼馬馬虎虎的用起來了

不可否認,functions是亮點,原型也是好東西,但是如果你想建立一個稍微複雜的JS應用,你就得這麼寫:

如果”MyApp.Views.WidgetView 還沒有定義“你會得到啥錯誤?”undefined is not a function”當然!你什麼時候會得到呢?當CollectionView想要例項化你的檢視的時候,而不是當你定義變數cv的時候,你會忐忑好幾分鐘,直到你明白了這錯誤是哪裡導致的

這是為啥呢?因為所有都是hash而且這個語言不能做任何形式的introspection

還有一個困擾我的事就是有些大哥居然從Ruby轉戰Node,還贊Node是個好東西。Node也許是好寶貝,但是想想它內部執行著屎一樣的Javascript語言,我就由衷地想退避三舍。

這麼說吧,JS一日不好用,我便一日不會用Node,謝謝

我理解有一些人想跳出MRI架構,投身Node,很簡單啊- -你不會說日語, 所以你舔個臉說日語很難學,話撂這,你在MRI上的有精進的機會也它媽趨近於0.

JS是屎,但凡我們有那麼一絲絲的擔當,就該儘自己的綿薄之力要麼讓它壽終正寢,要麼幫助它更上一層樓,天天在那沾沾自喜對它的發展沒有一點幫助,CoffeeScript做的還遠遠不夠。

更新:看這裡,我不是一個人在戰鬥

伯樂線上注:julik live 博主後來把標題改為了“For modern development Javascript indeed is a s̶h̶i̶t̶ dissapointing language”。另外,他部落格頁尾不美觀,佔用空間過大,在原文評論中被很多讀者吐槽了。當然了,也有熱心網友在幫他出主意了。

 

相關文章