Lua是一個動態類型的語言,沒有類型定義,每個值都有自己的類型。
Lua有8個基本類型,nil, boolean, number, string, userdata, function, thread, table,利用type函數可以打印出一個給定值的類型。

注意最后一行,無論x為什么值,結果一定是string,因為type函數的結果總是一個string。
變量沒有預定義的類型,任何變量可以有任何類型的值

注意最后兩行,函數也是可以用來賦值的,你可以像對待其他的變量一樣來把函數當成一個變量。
通常情況下,如果你把一個變量用來包含不同類型的值,會使代碼看起來很混亂。但是,有時有效地利用這個特性,會有意想不到的效果。例如使用nil來對函數的返回值就行判斷,來區分一個正常的返回值還是一個異常條件。
## 1 Nil
Nil類型只有一個值,nil,跟其他任何值都不同。如我們之前看到的,在一個全局變量未被賦值之前,它的值為nil,你也可以通過將一個全局變量賦值為nil來刪除它。Lua用nil作為一個無值類型,表示一個變量不再起作用。
## 2 Booleans
Boolean類型含有兩個值,true和false。但是Lua中可以表示條件的變量不僅僅boolean類型,任何值都可以表示條件。Lua認為false和nil為"假",其他任何值都是"真"。注意,跟其他語言不同的是,Lua認為0和空字符串為"真"。
## 3 Numbers
Number類型代表實數(在計算機中占兩個地址的浮點數)。Lua沒有整型,并且也不需要。有個普遍的誤解,使用浮點型會有算術錯誤,一些人害怕浮點型即使一個簡單的“加”運算也會有奇奇怪怪的問題。但事實上,用一個double類型來表示一個integer,不存在任何邊界問題(除非這個數大于1.0e14)。Lua可以表示任何的32-bit的整數,不存在任何邊界問題。除此之外,大多數cpu處理浮點數會比整數要快。
不過,Lua為了編譯方便,也使用了其他的number類型,例如long和單浮點數。這是為了兼容一些不支持double類型的設備。
以下這些numeric常量都是合法的
4
0.4
4.57e-3
0.3e12
5e+20
## 4 Strings
String在Lua中與其他編程語言沒有什么不同,都是表示一串字符。但是Lua可以在字符串中含有任何字符,包括0.
String在Lua中不可被更改,是常量。你不能更改一個字符串中的某一個字符,但是可以創建一個新的string。例如

Lua的string是自動管理內存的,其他的lua對象(例如table, function,etc)也一樣。這意味著你不必擔心string的內存分配與釋放,讓Lua為你處理這些問題就好了。一個string可以包含一個字符,也可以包含一整本書,Lua可以有效地處理長string,處理100k-1M的字符串,對Lua來說是小菜一碟。
### 4.1 Lua string的劃界
上面說了,Lua的string可以包含任何字符,甚至0(在C中,0是被認為是string的結尾的)。因此Lua對字符串邊界的判定,不能用0,而是匹配單引號'或者雙引號" :

但是在編程的時候,為了風格統一,最后是只用其中一種,除非string本身含有引號。或者在字符串中用轉義字符。Lua的string可以使用以下C風格的轉義字符:
\a ? ??bell
\b ? ??back space
\f ? ? form feed
\n ? ?newline
\r ? ??carriage return
\t ? ??horizontal tab
\v ? ??vertical tab
\\ ? ??backslash
\" ? ??double quote
\' ? ? ?single quote
示例如下:

我們可以在string中用一個字符的ASCII值來表示它,格式為\ddd,這里ddd最多包含3個數字字符,例如:

97表示"a", 10表示new line,49表示數字"1",注意\049沒有寫成\49的原因是,后面跟的字符是數字,若寫成\49,那么會被認為是\492,這就不是我們想要的了。
對string劃界,除了匹配引號之外,我們可以像處理長注釋一樣,匹配兩個“[[”“]]”。使用這種劃界方式的string通常會有幾行,如果第一個字符是“換行符”,則會被忽略掉,并且不會解釋轉義字符(如下示例),保持原樣輸出。通常在string中包含代碼片段的時候使用比較方便。

這個時候,有個疑問,如果我的string中含有“[[”或者“]]”,怎么辦。Lua提供了一個更方便的解決辦法,就是使用類似[====[這樣的匹配符號,“=”個數任意,但是保證前后相同,如果“=”個數不同,那么就會被忽略掉。

這種方式也可以用在長注釋中,這里就不演示了。
### 4.2 Lua中string與number的相互轉換
Lua提供了string和number的運行時自動轉換。任何對string進行的算術操作,都會嘗試將string轉換為number。例如:

除了算術操作,其他任何期待一個number的地方,如果傳入string,都是嘗試將string轉換為number。相反,在一個期待string的地方,如果傳入number,那么也會嘗試將number轉換為string。

“..”是Lua中的字符串連接符,在10之后要有一個空格“ ”,否則第一個“.”會被看作是小數點。
現在看來,在Lua的設計中,支持這些自動轉換是不是一個good idea,都沒有一個定論。但是,不要太指望它們。它們在少數場合用起來很方便,但是會增加語言的復雜性,增加使用它們的程序的復雜性。畢竟string和number是兩個不同的東西。10 == “10”是false,因為10是一個number,而“10”是一個string。如果你想把string轉換為number,顯式地用函數tonumber,如果要轉換的string不能被轉為number,它返回nil。

將number轉換為string,可以用函數tostring。另外,可以用“#”來取得一個string的長度。

水平有限,如果有朋友發現錯誤,歡迎留言交流。