一、概述
array是javascript的内置對象,同時也是一個構造函數,可以用它生成新的數組。
作為構造函數時,array可以接收參數,但是不同的參數,會是array産生不同的行為。
1、無參數時,傳回一個空數組。
2、單個參數時,如果該參數時正整數,則這個正整數表示新數組的長度;如果該參數是非正整數(比如,字元串,布爾,對象等),則該值是新數組的成員。
3、多個參數時,這些參數都是新數組的成員。
可以看到array的構造函數行為很不一緻,是以,不建議使用它生成新的數組,直接使用數組的字面量是更好地方法。
二、array對象的靜态方法
2.1、isarray方法
array.isarray()方法用來判斷一個值是否是數組。他可以彌補typeof運算符的不足。
上面代碼表示,typeof運算符隻能顯示數組的類型是object,而array.isarray方法可以對數組傳回true。
三、array對象執行個體的方法
以下這些array對象執行個體的方法,都是數組執行個體才能使用,如果不想出建立執行個體,隻是想單純的調用這些方法,可以寫成 [].method.call(調用對象,參數) 的形式,或者array.prototype.method.call(調用對象,參數) 的形式。
3.1、valueof方法,tostring方法
valueof方法,傳回數組本身。
tostring 方法傳回數組的字元串形式。
3.2、 push方法 pop方法
push方法用于在數組的末端添加一個或者多個元素,并傳回添加後數組的長度。
如果需要合并兩個數組,可以這樣寫。
上面兩種寫法等于 a1.push(4,5,6);
pop方法用于删除數組的最後一個元素,并傳回該元素。
對于空數組使用pop方法,不會報錯,而是會傳回undefined
3.3、join方法 concat方法
join方法以參數作為分隔符,将所有的數組成員組成一個字元串傳回。如果不提供參數,預設使用逗号作為分隔符。
通過函數的call方法,join方法(array.prototype.join)也可以用于字元串。
concat方法将新數組的成員,添加到原數組的尾部,然後傳回一個新數組,常用于連結多個數組。
上面代碼表明,concat方法的參數可以是一個或者多個數組,以及原始類型的值。
如果不提供參數,concat方法傳回目前數組的一個淺拷貝。所謂“淺拷貝”,指的是如果數組成員包括複合類型的值(比如對象),則新數組拷貝的是該值的引用。
上面代碼中,原數組包含一個對象,concat方法生成的新數組包含這個對象的引用。是以,改變原對象以後,新數組跟着改變。事實上,隻要原數組的成員中包含對象,concat方法不管有沒有參數,總是傳回該對象的引用。
concat方法也可以用于将對象合并為數組,但是必須借助call方法。
3.4、shift方法 unshift方法
shift方法用于删除數組的第一個元素,并傳回該元素。
shift方法可以周遊并清空一個數組。
unshift方法用于在數組的第一個位置添加元素,并傳回添加新元素後的數組長度。
3.5、reverse方法
reverse方法用于颠倒數組中元素的順序,使用這個方法以後,傳回改變後的原數組。
3.6、slice方法
slice方法傳回指定位置的數組成員組成的新數組,原數組不變。它的第一個參數為起始位置(從0開始),第二個參數為終止位置(但該位置的元素本身不包括在内)。如果省略第二個參數,則一直傳回到原數組的最後一個成員。
上面代碼表示,如果slice方法的參數是負數,則從尾部開始選擇的成員個數;如果參數值大于數組成員的個數,或者第二個參數小于第一個參數,則傳回空數組。
slice方法的一個重要應用,是将類似數組的對象轉為真正的數組。
上面代碼的參數都不是數組,但是通過call方法,在它們上面調用slice方法,就可以把它們轉為真正的數組。
3.7、splice方法
splice方法用于删除元素,并可以在被删除的位置添加入新的數組元素。它的傳回值是被删除的元素。需要特别注意的是,該方法會改變原數組。
splice的第一個參數是删除的起始位置,第二個參數是被删除的元素個數。如果後面還有更多的參數,則表示這些就是要被插入數組的新元素。
上面代碼從原數組位置4開始,删除了兩個數組成員。
上面代碼除了删除成員,還插入了兩個新成員。
如果隻是單純地插入元素,splice方法的第二個參數可以設為0。
如果隻提供第一個參數,則實際上等同于将原數組在指定位置拆分成兩個數組。
3.8、sort方法
sort方法對數組元素進行排序,預設是按照字典順序排序。排序後,原數組将被改變。
sort方法可以接受一個參數,表示按照自定義方法進行排序。該參數是一個函數,本身又接受兩個參數,表示進行比較的兩個元素。如果傳回值大于0,表示第一個元素排在第二個元素後面;其他情況下,都是第一個元素排在第二個元素前面。
四、ecma script5新加入的的數組方法
ecmascript 5新增了9個數組執行個體的方法,分别是map,foreach, filter,every,some,reduce,reduceright,indexof和lastindexof。其中前7個與函數式(functional)操作有關。
這些方法也可以在數組上使用,也可以在字元串和類似數組的對象上使用,這是它們不同于傳統數組方法的一個地方。
在用法上,這些方法的參數是一個函數,這個作為參數的函數本身又接受三個參數;數組的目前元素elem、該元素的位置index和整個數組arr(詳見下面的執行個體),另外,上下文對象(context)可以作為第二個參數,傳入foreach(),every(),some(),filter(),map()方法,用來綁定函數運作時的上下文。
注意:ie8以下版本的浏覽器不支援這些方法。
4.1、map方法、foreach方法
map方法對所有元依次調用一個函數,根據函數結果傳回一個新數組。
通過函數的call方法,map方法可以用于字元串。
foreach方法對所有元素依次執行一個函數,它與map的差別在于不傳回新數組,而是對原數組的成員執行某種操作,甚至可能改變原數組的值。
從上面代碼可以看到,map和foreach的參數格式是一樣的,都是一個函數。該函數接受三個參數,分别是目前元素、目前元素的位置(從0開始)、整個數組。
這兩個方法都可以接受第二個參數,用來綁定函數中的this關鍵字。
上面的兩行代碼是等價的。下面是一個執行個體;
上面代碼表示,如果提供一個數組作為第二個參數,則函數内部的this關鍵字就指向這個數組。
4.2、filter方法
filter方法依次對所有數組成員調用一個測試函數,傳回結果為true的成員組成一個新數組傳回。
上面代碼将大于3的原數組成員,作為一個新數組傳回。類似于一個篩選器。
filter方法的參數必須是一個傳回布爾值的函數。該函數的第一個參數是目前數組成員的值,這是必需的,後兩個參數是可選的,分别是目前數組成員的位置和整個數組。
4.3、some方法 every方法
這兩個方法類似“斷言”(assert),用來判斷數組成員是否符合某種條件。
some方法對所有元素調用一個測試函數,隻要有一個元素通過該測試,就傳回true,否則傳回false。
上面代碼表示,如果存在大于等于3的數組成員,就傳回true。
every方法對所有元素調用一個測試函數,隻有所有元素通過該測試,才傳回true,否則傳回false。
上面代碼表示,隻有所有數組成員大于等于3,才傳回true。
從上面的代碼可以看到,some和every的使用方法與map和foreach是一緻的,參數完全一模一樣。也就是說,它們也可以使用第二個參數,用來綁定函數中的this關鍵字。
4.4、reduce方法、reduceright方法
這兩個方法的作用,是依次處理數組中的每一個元素,最終累計為一個值。這兩個方法的差異在于,reduce對數組元素的處理順序是從左到右(從第一個成員到最後一個成員),reduceright則是從右到左(從最後一個成員到第一個成員),其它的地方也一樣。
reduce方法的第一個參數是一個處理函數。該函數接受四個參數,分别是:
1、用來累計的變量(即目前狀态),預設值為0.
2、數組的目前元素
3、目前元素在數組中的序号(從0開始)
4、原數組
這四個參數之中,隻有前兩個是必須的,後兩個則是可選的。
上面代碼的參數sum表示累計變量,預設為0,elem則是數組的目前元素。reduce方法依次将每個數組元素加入sum,最終傳回它們的總和15。
利用reduce方法,可以寫一個數組求和的sum方法。
如果要對累計變量指定初值,可以把它放在reduce方法的第二個參數。
上面代碼指定參數x的初值為10,是以數組元素從10開始累加,最終結果為25。
4.5、indexof 和 lastindexof方法
ecmascript 5新增的9個方法之中,有2個與函數式程式設計無關,分别是indexof和lastindexof。
indexof方法傳回給定元素在數組中第一次出現的位置,如果沒有出現則傳回-1。
indexof方法還可以接受第二個參數,表示搜尋的開始位置。
上面代碼從位置1開始搜尋字元a,結果為-1,表示沒有搜尋到。
lastindexof方法傳回給定元素在數組中最後一次出現的位置,如果沒有出現則傳回-1。
上面是因為沒有找到,是以反悔了 -1。
注意,如果數組中包含nan,這兩個方法不适用。
這是因為這兩個方法内部,使用嚴格相等運算符(===)進行比較,而nan是唯一一個不等于自身的值。