Dart 比 JavaScript 更酷的10個理由
1
Dart 是 Google發明的一種新的編程語言。在使用JavaScript一年多以后,我對Dart可謂是一見鐘情。我以前是做Java的,我在用JS的時候要學習很多新東西。
有人說你必須深入研究JavaScript,否則你沒有資格評論它。我不是JS高手,但是我堅信一門編程語言應該易于學習,易于理解,并且語言結構要合理。雖然我也長時間和JS打交道,雖然我也知道JS有很多酷的功能,但是我還是每天得小心翼翼的處理JS的問題。這就很不好,編程語言應該對程序員友好,而不是程序員去伺候一門語言。
下面我將列出Dart比JavaScript強的地方,也是吸引我轉移到Dart的原因。
1. Dart只有一種否定條件
在JS中,你可以用 false, null, undefined,"",0,NaN 作為否定條件,例如:
雖然多種否定條件也沒有問題,但是明顯程序變的復雜和難以閱讀,而且你需要學習各種否定條件。
2. Dart可以使用類型
JS開發者往往強調,類型會降低靈活性。OK,也許是對的。但是過多的靈活性會讓你的軟件崩潰。有時候,你需要用到類型,在Dart中,這就可以實現,你可以啟用類型檢查。
3. JS需要一個框架來解析DOM
看看JS的這些方法吧:
當Java開發者剛開始寫JS的時候,他們總是把JS寫的跟Java一樣。他們會寫類和構造函數,很顯然,JS不是這么玩的。在JS中,任何東西都是對象,這看起來很酷,但是那些設計模式就沒有用了。取而代之的是JavaScript的設計模式。但這給開發者造成了很多困惑,也讓代碼一團糟。
5. 繼承
用JavaScript有很多方式實現繼承,例如 Dr. Rauschmayer 博客(http://www.2ality.com/2011/11/javascript-classes.html)中講的那樣。或者你也可以用Prototype和jQuery框架,或者你也可以自己實現一套繼承的機制。這樣就很混亂,為了實現繼承這個目標,JS有很多不同的做法,讓人頭疼。
Dart有類這個概念,所以也就有“extends”這個關鍵詞。一切都很簡單!
6. 全局名字空間
在JS中,如果你有什么變量在全局級別的話,所有的腳本都可以訪問這個變量,這就很恐怖,代碼會變的很混亂感。后來我學習了Stoyan Stefanovs Book JavaScript Patterns (http://astore.amazon.de/neoteccde-21/detail/0596806752),我的命名空間從此變的很干凈。但是為什么這種基本的功能語言不能自帶,而需要通過所謂的模式來解決這個問題呢?
Dart默認是“library”范圍,只有聲明為 public 的東西才能被外部訪問。這樣就很簡單,不同的腳本不會相互影響。
7. Dart支持并行
JS是沒有真正的并行的。即使你通過jQuery發出一個異步請求,你也只有一個線程在工作。你可以通過HTML5,webworkers來解決這個問題。
Dart支持并行,支持Isolates,這有點像Erlang。當一個Isolate失敗的時候,另外一個Isolate可以重啟這個Isolate。這是不是很酷?這讓Dart適合服務器端編程。是的,我知道Node.js,但是Dart天生支持這個功能。
8. JS 不支持 foreach
在JS中,你這樣遍歷數組:
使用Dart:
9. 奇怪的數組初始化
看看這段代碼:
a2 是有五個元素的數組 [undefined,undefined,undefined,undefined,undefined]
Dart就很清晰:
在JS中,這兩個值大多數情況可以互換,但有時候又不是,讓人很頭疼。Dart只有null。
總結
JS有很多優點,有一些不錯的模式。但是到目前為止,我還沒有發現什么JS能做而Dart不能做的。Dart明顯更優雅,更易于閱讀(對我而言)。也許有一些JS狂人覺得JS好,可以理解。
英文原文
有人說你必須深入研究JavaScript,否則你沒有資格評論它。我不是JS高手,但是我堅信一門編程語言應該易于學習,易于理解,并且語言結構要合理。雖然我也長時間和JS打交道,雖然我也知道JS有很多酷的功能,但是我還是每天得小心翼翼的處理JS的問題。這就很不好,編程語言應該對程序員友好,而不是程序員去伺候一門語言。
下面我將列出Dart比JavaScript強的地方,也是吸引我轉移到Dart的原因。
1. Dart只有一種否定條件
在JS中,你可以用 false, null, undefined,"",0,NaN 作為否定條件,例如:
var a = null; if(!a) { // do }在Dart中,只有 false 才是否定條件,上面的代碼必須寫成這樣:
var a = null; if(a != null) { // do }
雖然多種否定條件也沒有問題,但是明顯程序變的復雜和難以閱讀,而且你需要學習各種否定條件。
2. Dart可以使用類型
JS開發者往往強調,類型會降低靈活性。OK,也許是對的。但是過多的靈活性會讓你的軟件崩潰。有時候,你需要用到類型,在Dart中,這就可以實現,你可以啟用類型檢查。
3. JS需要一個框架來解析DOM
看看JS的這些方法吧:
getElementsById() getElementsByTagName() getElementsByName() getElementsByClassName() querySelector() querySelectorAll() document.links document.images document.forms document.scripts formElement.elements selectElement.options強大嗎?但是我們有JQuery,Dart學習了JQuery,只有兩個方法:
elem.query('#foo'); elem.queryAll('.foo');4. 類和接口
當Java開發者剛開始寫JS的時候,他們總是把JS寫的跟Java一樣。他們會寫類和構造函數,很顯然,JS不是這么玩的。在JS中,任何東西都是對象,這看起來很酷,但是那些設計模式就沒有用了。取而代之的是JavaScript的設計模式。但這給開發者造成了很多困惑,也讓代碼一團糟。
5. 繼承
用JavaScript有很多方式實現繼承,例如 Dr. Rauschmayer 博客(http://www.2ality.com/2011/11/javascript-classes.html)中講的那樣。或者你也可以用Prototype和jQuery框架,或者你也可以自己實現一套繼承的機制。這樣就很混亂,為了實現繼承這個目標,JS有很多不同的做法,讓人頭疼。
Dart有類這個概念,所以也就有“extends”這個關鍵詞。一切都很簡單!
6. 全局名字空間
在JS中,如果你有什么變量在全局級別的話,所有的腳本都可以訪問這個變量,這就很恐怖,代碼會變的很混亂感。后來我學習了Stoyan Stefanovs Book JavaScript Patterns (http://astore.amazon.de/neoteccde-21/detail/0596806752),我的命名空間從此變的很干凈。但是為什么這種基本的功能語言不能自帶,而需要通過所謂的模式來解決這個問題呢?
Dart默認是“library”范圍,只有聲明為 public 的東西才能被外部訪問。這樣就很簡單,不同的腳本不會相互影響。
7. Dart支持并行
JS是沒有真正的并行的。即使你通過jQuery發出一個異步請求,你也只有一個線程在工作。你可以通過HTML5,webworkers來解決這個問題。
Dart支持并行,支持Isolates,這有點像Erlang。當一個Isolate失敗的時候,另外一個Isolate可以重啟這個Isolate。這是不是很酷?這讓Dart適合服務器端編程。是的,我知道Node.js,但是Dart天生支持這個功能。
8. JS 不支持 foreach
在JS中,你這樣遍歷數組:
for (var i = 0; i < elements.length; i++) { // do something }或者你可以這樣來遍歷對象:
for (key in elements) { alert(elements[key]); }但這種方式是不推薦的。因為這種遍歷方式得到的結果是不確定的,你也有可能拿到方法名字等你不想要的東西。當然,jQuery是你的救星!
使用Dart:
for (element in elements) { // do something }沒有比這更簡單了吧。
9. 奇怪的數組初始化
看看這段代碼:
var a1 = new Array(1,2,3,4,5); var a2 = new Array(5);a1 是有五個元素的數組 [1,2,3,4,5]
a2 是有五個元素的數組 [undefined,undefined,undefined,undefined,undefined]
Dart就很清晰:
List a1 = [1,2,3,4,5]; List a2 = new List(5);10. undefined 和 null
在JS中,這兩個值大多數情況可以互換,但有時候又不是,讓人很頭疼。Dart只有null。
總結
JS有很多優點,有一些不錯的模式。但是到目前為止,我還沒有發現什么JS能做而Dart不能做的。Dart明顯更優雅,更易于閱讀(對我而言)。也許有一些JS狂人覺得JS好,可以理解。
英文原文