在前面我們提到了有關數組的定義和數組的一些特性,那篇博客只提到了三種定義方式,這裏我們再補充兩種方式:
第一種:數組泛型
// 語法格式:Array<elemType>
let list: Array<number> = [1, 2, 3];
第二種:類數組
function sum() {
let args: {
[index: number]: number;
length: number;
callee: Function;
} = arguments;
}
上述兩種方式,第一種比較好理解,但是第二種,看上去就很麻煩了。
我們先弄清楚什麼是類數組?字面意思,就是像數組的數組,典型的代表就是內置對象arguments了。這裏,我們先來簡單說一下內置對象arguments:
我們可以這麼來理解,內置對象首先就是內置,內置在哪兒呢?答案就是函數,每個函數內都有一個arguments。其次內置對象就是對象,那麼arguments這個對象內一般包含哪些屬性呢?答案是它包括了函數所要調的參數,通常我們把它當作數組使用,用它的length得到參數數量,但它卻不是數組,不過我們還是可以利用arguments來使用傳遞進來的實參,arguments[0]表示獲取的第一個實參,arguments[1]表示獲取的第二個實參.......以此類推。同時arguments還有一個callee,對應一個函數對象,就是當前正在指向的函數的對象。附上一個例子來方便理解,代碼如下:
function fnc() {
// 獲取的是函數在調用的時候,傳入了幾個參數
// 再次強調:arguments不是數組,它僅僅具有數組的length屬性,不具備數組的其它特性
console.log(arguments.length);
// 使用arguments 對象可以獲取傳入的每個參數的值
console.log(arguments);
// arguments的callee屬性可以返回對應的原函數,達到調用自身函數的效果,但是在嚴格模式中是不適用的
console.log(arguments.callee === fnc); //true
}
fnc(1, 2, 3, 4, 5);
簡單介紹完內置對象後,我們再看下類數組的定義方式:
function sum() {
let args: {
[index: number]: number;
length: number;
callee: Function;
} = arguments;
}
我們定義了類數組內三種值類型,首先是函數傳遞進來的參數,在arguments中索引必須是number類型,其對應傳遞進來的參數也是number類型,就類似於前面提到的例子fnc(1, 2, 3, 4, 5);其次,arguments的length屬性我們也限制了它的值爲number類型的;最後就是arguments的callee屬性了,同樣我們限制了它的類型是函數Function類型。這就是類數組的定義,這種方式我們平時用的很少,所以瞭解一哈即可。
到底啦!!!!!!!!