Array()僅僅是一種特殊類型的Object(),也就是說,Array()實例基本上是擁有一些額外功能的Object()實例。數組可以保存任何類型的值,這些值可以隨時更新或刪除,且數組的大小是動態調整的
除了對象之外,數組Array類型可能是javascript中最常用的類型了。而且,javascript中的數組與其他多數語言中的數組有著相當大的區別。本文將介紹javascript中的數組Array類型
創建數組
有兩種創建數組的方法:使用字面量語法和使用Array()構造函數
【字面量】
使用數組字面量是創建數組最簡單的方法,在方括號中將數組元素用逗號隔開即可
雖然javascript數組與其他語言中的數組都是數據的有序列表,但與其他語言不同的是,javascript數組的每一項可以保存任何類型的數據
數組字面量中的值不一定要是常量,它們可以是任意的表達式
它可以包含對象字面量或其他數組字面量
如果數組的元素還是數組,就形成了多維數組
[注意]使用數字字面量表示法時,不會調用Array構造函數
【構造函數】
有三種方式調用構造函數
【1】沒有參數,創建一個空數組
【2】有一個數值參數,該參數用于指定數組的長度
[注意]若存在一個其他類型的參數,則會創建包含那個值的只有一項的數組
【3】有多個參數時,參數表示為數組的具體元素
使用Array()構造函數時,可以省略new操作符
數組本質
數組是按次序排列的一組值,本質上,數組是一種特殊的對象
數組的特殊性體現在,它的鍵名是按次序排列的一組整數(0,1,2…)。由于數組成員的鍵名是固定的,因此數組不用為每個元素指定鍵名,而對象的每個成員都必須指定鍵名
數組是對象的特殊形式,使用方括號訪問數組元素就像用方括號訪問對象的屬性一樣
javascript語言規定,對象的鍵名一律為字符串,所以,數組的鍵名其實也是字符串。之所以可以用數值讀取,是因為非字符串的鍵名會被轉為字符串,然后將其作為屬性名來使用
但是,一定要區分數組索引和對象的屬性名:所有的索引都是屬性名,但只有在0~232-2(4294967294)之間的整數屬性名才是索引
[注意]單獨的數值不能作為標識符(identifier)。所以,數組成員只能用方括號法表示
可以使用負數或非整數來索引數組。但由于其不在0~2的32次方-2的范圍內,所以其只是數組的屬性名,而不是數組的索引,明顯的特征是不改變數組的長度
數組長度
每個數組有一個length屬性,就是這個屬性使其區別于常規的JavaScript對象。針對稠密(也就是非稀疏)數組,length屬性值代表數組中元素的個數,其值比數組中最大的索引大1
當數組是稀疏數組時,length屬性值大于元素的個數,同樣地,其值比數組中最大的索引大1
數組的特殊性主要體現在數組長度是可以動態調整的:
【1】如果為一個數組元素賦值,索引i大于等于現有數組的長度時,length屬性的值將設置為i+1
【2】設置length屬性為小于當前長度的非負整數n時,當前數組索引值大于等于n的元素將從中刪除
【3】將數組的length屬性值設置為大于其當前的長度。實際上這不會向數組中添加新的元素,它只是在數組尾部創建一個空的區域
如果人為設置length為不合法的值(即0——232-2范圍以外的值),javascript會報錯
由于數組本質上是對象,所以可以為數組添加屬性,但是這不影響length屬性的值
數組遍歷
使用for循環遍歷數組元素最常見的方法
當然,也可以使用while循環
但如果數組是稀疏數組時,使用for循環,就需要添加一些條件
還可以使用for/in循環處理稀疏數組。循環每次將一個可枚舉的屬性名(包括數組索引)賦值給循環變量。不存在的索引將不會遍歷到
由于for/in循環能夠枚舉繼承的屬性名,如添加到Array.prototype中的方法。由于這個原因,在數組上不應該使用for/in循環,除非使用額外的檢測方法來過濾不想要的屬性
javascript規范允許for/in循環以不同的順序遍歷對象的屬性。通常數組元素的遍歷實現是升序的,但不能保證一定是這樣的。特別地,如果數組同時擁有對象屬性和數組元素,返回的屬性名很可能是按照創建的順序而非數值的大小順序。如果算法依賴于遍歷的順序,那么最好不要使用for/in而用常規的for循環
有三個常見的類數組對象:
【1】arguments對象
【2】DOM方法(如document.getElementsByTagName()方法)返回的對象
【3】字符串
[注意]字符串是不可變值,故當把它們作為數組看待時,它們是只讀的。如push()、sort()、reverse()、splice()等數組方法會修改數組,它們在字符串上是無效的,且會報錯
數組的slice方法將類數組對象變成真正的數組
javascript數組方法是特意定義為通用的,因此它們不僅應用在真正的數組而且在類數組對象上都能正確工作。在ECMAScript5中,所有的數組方法都是通用的。在ECMAScript3中,除了toString()和toLocaleString()以外的所有方法也是通用的
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com