在javascript中其實(shí)沒(méi)有二維數(shù)組的類(lèi)型, 我們實(shí)現(xiàn)二維數(shù)組的方法是向數(shù)組的元素插入數(shù)組, 而typescript提供了不一樣的方式來(lái)表示二維數(shù)組.
typescript的二維數(shù)組寫(xiě)法如下:
let twoM : string[][]
這是變成成js后的代碼
var twoM;
也可以用Array
let twoM : Array<Array<string>>;
建議聲明數(shù)組用Array, 代碼比較清晰.
請(qǐng)注意這段代碼, 編譯成js后, 變量是不會(huì)自動(dòng)初始化成數(shù)組的, 如果之后直接給twoM插入一個(gè)值會(huì)報(bào)錯(cuò), 例如:
let twoM : string[][]
twoM.push(["abc"])
編譯成功, 但是執(zhí)行編譯后的js會(huì)出現(xiàn)這個(gè)錯(cuò)誤
TypeError: Cannot read property 'push' of undefined
我們看看編譯后的js
var twoM;
twoM.push(["abc"]);
由于twoM只是聲明了, 并沒(méi)有初始化, 所以運(yùn)行的時(shí)候變量的初始值是undefined.
要避免這個(gè)錯(cuò)誤, 可以在聲明的時(shí)候初始化變量
let twoM : string[][] = []
//或
let twoM : Array<Array<string>> = new Array<Array<string>>()
這樣編譯后的js就是
var twoM = [];
//或
var twoM = new Array();
現(xiàn)在運(yùn)行就不會(huì)出問(wèn)題了, 這里還要注意, 由于是二維數(shù)組, 所以第二維還是undefined的, 不能直接twoM[0][1] = "a1", 這樣可以編譯通過(guò), 但是執(zhí)行的時(shí)候會(huì)出現(xiàn)剛才同樣的錯(cuò)誤.
正確的初始化方式是這樣的
twoM[0] = ["a1", "a2", "a3"] //直接賦值數(shù)組
twoM.push([]) //先插入一個(gè)空的數(shù)組
twoM[1][1] = "b2" //再向剛插入的數(shù)組賦值
在javascript中其實(shí)沒(méi)有二維數(shù)組的類(lèi)型, 我們實(shí)現(xiàn)二維數(shù)組的方法是向數(shù)組的元素插入數(shù)組, 雖然typescript提供了不一樣的方式來(lái)表示二維數(shù)組, 但是最終編譯成js的實(shí)現(xiàn)形式其實(shí)沒(méi)有多大改變, 所以有幾點(diǎn)需要注意:
- 用中括號(hào)的方式定義數(shù)組不夠清晰, 最好用Array
- 數(shù)組要初始化才可以使用
- 二維數(shù)組需要每個(gè)維度都初始化的, 如果只初始化了第一個(gè)維度, 其他維度直接使用還是會(huì)報(bào)錯(cuò)