JavaScript之數組

概述

JavaScript數組的索引是基於零的32位數值,第一個元素的索引爲0,最多可能的索引爲(2^32-2),針對稀疏矩陣,length比所有元素的索引都大


創建數組

數組直接量的語法允許有可選的結尾逗號,故[,,]只有兩個元素

new Array(10)  //長度爲10的空數組

數組元素的讀和寫

數組是對象的特殊形式


所有的索引都是屬性嗎,但只有0~2^ 32-2之間的整數屬性名纔是索引。所有的數組都是對象,可以爲其創建人意名字的屬性。但如果使用的屬性是數組的索引,則會根據需要更新其length值

可以使用附屬或非整數來索引數組,這種情況下,數值轉換爲字符串然後當屬性名來用,這樣就是常規的對象屬性,而不是數組的索引。同樣,如果是使用了非負整數的字符串,就當作數組索引,而非對象索引。當使用一個浮點數和一個整數相等時情況也一樣。


事實上數組索引僅僅是對象屬性名的一種特殊類型,這意味着JavaScript數組沒有越界錯誤。當試圖查找不存在的屬性,返回undefined


當一個數組缺失繼承了元素或者使用了元素的getter和setter方法,則很可能使用非優化路徑(類似於常規對象查找)


稀疏矩陣

若矩陣爲稀疏,則length大於元素個數


足夠稀疏的數組通常在實現上比稠密的數組更慢、內存利用率更高,在這樣的數組中查找元素的時間與常規對象屬性的查找時間一樣長

當在數組直接量中省略值時不會產生稀疏數組——省略的元素值爲undefined,而不是不存在


數組長度

每個數組有一個length,就是這個屬性時期區別於常規的JavaScript對象


當數組是稀疏的時,length屬性值大於元素的個數。而且關於此可以說一切也就是數組長度必然大於任意一個索引值。


當length設置爲一個小於當前長度的非負整數n時,當前數組中國年那些索引值大於等於n的元素將被刪除,


數組元素的添加和刪除

delete操作並不影響數組長度,而數組進行delete操作,就會變爲稀疏數組


數組遍歷

通常數組元素的便利是生序的,但不必然如此。

當一個數組同時擁有對象屬性和數組元素,返回的屬性名很可能是按照創建順序而不是數值的大小順序


多維數組

JavaScript不支持真正的多維數組,但可以用數組的數組來近似


數組方法

Array.join()方法是String.split()方法的逆向操作,後者是將字符串分割成若干塊來創建一個數組


Array.reverse()方法將數組中的元素點到順序,返回逆序的數組。它採取了替換;換句話說,他不通過重新排列的元素創建新的數組,而是在原先的數組中重新排列(改變原數組)


不帶參數的sort調用sort()時,數組元素以字幕版順序排序(如果需要會轉化爲字符串比較)

若數組包含undefined元素,則會被拍到數組尾部

爲了按照其他方式而非字母表順序進行數組操作,必須給sort傳入一個比較函數(返回一個數值,大於0則是a>b)


concat不會遞歸扁平化數組的數組

x=[1,2,3].concat(4,[4,[7,3]])
//(6) [1, 2, 3, 4, 4, Array(2)]


splice如果省略第二個參數,則從起始點到數組結尾所有元素都被刪除,splice返回一個被刪除的數組,若干沒有刪除元素則返回空數組

區別於concat,splice會插入數組本身而不是數組的元素


unshift()返回數組長度

shift()返回刪除的元素

當使用多個參數調用unshift()時它的行爲令人驚訝,參數時一次性插入。


數組的toString()方法會將每個元素都變爲字符串,和不加任何參數的join是一樣的


ES5中的數組方法

如果是稀疏數組,對不存在的元素不調用傳遞的函數。在大多數情況下,調用提供的函數使用3個參數:數組元素,元素的索引和數組本身。大多數ES5數組的方法的第一個參數是函數,第二個參數是可選的。如果有第二個參數,則調用的函數被看作是第二個參數的調用方法,也就是說第二個參數作爲this


forEach()無法在所有元素傳給函數前就終止遍歷,若要強行終止,只能選擇拋出異常。

map()返回的是新數組:它修改調用數組,如果原數組是稀疏數組,返回的也是相同方式的稀疏數組。


filter()會跳過稀疏數組中缺少的元素,其返回值總是稠密的。爲了壓縮稀疏數組的空缺,可以直接返回true


一旦every()或some()確認該返回什麼值她們就會停止遍歷數組元素。根據數學上的慣例,在空數組上調用時,every()返回true,some()返回false


化簡函數的任務就是通過把兩個值組合或化簡爲一個值,並返回化簡後的值。第二個(可選)參數時傳遞給函數的初始值。


reduce()函數的數組元素、元素索引和數組本身將作爲第2-4的參數傳入,第一個爲截止目前的化簡值。

在空數組上,不帶初始值參數調用reduce()將導致類型錯誤異常。如果調用的時候只有一個值——數組只有一個元素且無初始值或數組爲空且有一個初始值,則reduce()只是簡單地返回那個址erbium調用化簡函數

reduce()和reduceRight()都能接受一個可選參數,它指定化簡函數的this值


數組類型

給定一個未知的對象,判斷是否爲數組用Array.isArray()函數


作爲數組的字符串

字符串是不可變值,故當把它們看作數組時,是制度的。如push().sort().reverse()和splice()等數組方法會改變數組,在字符串上是無效的。不僅如此,使用數組方法來修改字符串會導致錯誤——出錯時無提示


發佈了92 篇原創文章 · 獲贊 30 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章