概述
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()等數組方法會改變數組,在字符串上是無效的。不僅如此,使用數組方法來修改字符串會導致錯誤——出錯時無提示