1. 程式人生 > >淺談 var 關鍵字

淺談 var 關鍵字

簡潔 混淆 list() 是否一致 運行機制 private 靜態類型語言 技術支持 som

提起 var關鍵子,程序員的第一反應就是JavaScript, 事實上這個關鍵子在其他語言中也有被采用。

比如說C#, 比如說kotlin, 用法和JavaScript中使用差不多,作為要聲明變量的前綴

var myInt = 1;
var myList = new List<String>();
var myValue = getValue();

在其他語言中也有與var作用類似的關鍵字,比說C++中的auto,比如TypeScript中的let,比如kotlin中的val

auto myInt = 1;
let myValue 
= getValue(); val myString = "kotlinlanguage"

var以及與其同意的關鍵字被使用的如此廣泛,看起來用這些關鍵字的代碼都長一個樣, 然而, JavaScript中的var關鍵字與其它語言中的var關鍵字有本質的不同。

在JavaScript中,var關鍵字最重要的作用是控制變量的作用域, 其中細節我們不在這裏講解,除此之外,它最大的作用可能就是使代碼美觀而已。

而在其它語言中, 這個關鍵之是大大的有門道, 在這些語言中,這個關鍵字背後有一項稱之為“類型推導”的技術支持著這個關鍵字的運行。

在Java語言中,我們常常這樣寫代碼。

Integer myInt = 1;
String strSql = "select * fromtableName";

在聲明一個變量時, 都會在變量名前加上這個變量的類型信息, 編譯器是通過這個類型批註來判斷變量類型的,如果代碼中有對變量進行不符合類型規範的操作,編譯器就會報錯, 這便是靜態類型語言代碼不易出錯的基礎。

這樣寫表面上看起來挺和諧, 但如果是這樣的代碼呢

List<Map<String,Map<String,List<String>>>> myList = new ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>();

不要懷疑,比這更加操蛋的代碼都有。 聲明這個變量會耗費我們不少時間,我們要仔細檢查語句兩邊的類型是否一致。var關鍵字, 確切的說是類型推導技術, 可以簡化這條語句。

var myList = new ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>();

代碼變得簡潔,而且編譯器通過類型推導技術可以確定myList的類型就是

ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>

而不用通過變量前面那一長串長長的類型批註信息來確定。

再來一個更加明顯的, 代碼如下

private List<Map<String,Map<String,List<String>>>> getMyList() {
    // dosomething 
    return new ArrayList<TreeMap<String,HashMap<String,ArrayList<String>>>>();

}

在不帶類型推導機制的語言裏, 調用這個函數需要這樣寫

List<Map<String,Map<String,List<String>>>> myList =  getMyList();

你不得不根據這個函數的返回值寫一串長長的類型代碼, 而且, 當這個函數的返回值改變時,這個變量前面的類型批註也要跟著變,假如這個函數被調用一百次,那麽修改這些調用代碼將是一件異常頭疼的事情,當然,你可以借助IDE的能力來批量轉換,但這屬於外力, 有種橫沖直撞使用蠻力的味道。

如果使用類型推導技術,這個問題能被很好的解決,甚至於這根本不是個問題。

var myList =  getMyList();
var myList1 =  getMyList();
var myList1 =  getMyList();

不但代碼簡短,而且沒有類型依賴。 可惜這麽好的特性,宇宙第一的Java居然不支持,令人遺憾。 所幸, Java以外的其它主流靜態類型編程語言都已經支持。如上面所說, C++的auto, C#的var,kotlin的var和val,都有類型推導的功能。

而JavaScript中的var關鍵字卻和類型推導沒有半毛錢關系,甚至JavaScript代碼根本沒有類型一說, JavaScript的類型都是在運行期確定的,那個時候的JavaScript已經不再是我們所看到的JavaScript代碼。

所以說, 當我們在其它語言中見到var關鍵字的時候,千萬不要把他們和JavaScript中的var混淆,因為它們背後完全是兩種不同的運行機制。

淺談 var 關鍵字