陣列常用函數
concat
#在現有陣列後面追加數組,並傳回新數組,不影響現有數組:
var a = [123]; var b = "sunnycat"; var c = ["www",21,"ido"]; var d = {x:3.14, y:"SK"}; var e = [1,2,3,4,[5,6,[7,8]]]; alert(a.concat(b)); // -> 123,sunnycat alert(a); // -> 123 alert(b.concat(c, d)); // -> sunnycatwww,21,ido[object Object] alert(c.concat(b)); // -> www,21,ido,sunnycat alert(e.concat(11,22,33).join(" # ")); // -> 1 # 2 # 3 # 4 # 5,6,7,8 # 11 # 22 # 33
要注意的是只能用於數組或字串,如果被連接(前面的a)的是數值、布林值、對象,就會報錯,字串連接數組時,字串會跟數組首元素拼接成新元素,而數組連接字串則會追加新元素(這點我也不清楚原委,知情者請透露),對於數組裡麵包含數組、對象的,連接後保持原樣。
join
用指定間隔符號連起來,把陣列轉為字串:
var a = ['a','b','c','d','e','f','g']; lert(a.join(",")); // -> a,b,c,d,e,f,g 相当于a.toString() alert(a.join(" x ")); // -> a x b x c x d x e x f x g
這個很容易理解,但需要注意的是只轉換一維數組裡面,如果數組裡面還有數組,將不是採用join指定的字串接,而是採用預設的toString(),例如
var a = ['a','b','c','d','e','f','g',[11,22,33]]; alert(a.join(" * ")); // -> a * b * c * d * e * f * g * 11,22,33
註:數組裡面的數組,並沒用* 連接
pop
刪除陣列最後一個元素,並傳回該元素
var a = ["aa","bb","cc"]; document.write(a.pop()); // -> cc document.write(a); // -> aa, bb
註:如果陣列為空,則傳回undefined
push
往數組後面新增數組,並返回數組新長度
var a = ["aa","bb","cc"]; document.write(a.push("dd")); // -> 4 document.write(a); // -> aa,bb,cc,dd document.write(a.push([1,2,3])); // -> 5 document.write(a); // -> aa,bb,cc,dd,1,2,3
跟concat的區別在於,concat不影響原始數組,直接返回新數組,而push則直接修改原數組,傳回的是數組新長度
sort
數組排序,先看個例子
var a = [11,2,3,33445,5654,654,"asd","b"]; alert(a.sort()); // -> 11,2,3,33445,5654,654,asd,b
結果是不是很意外,沒錯,排序並不是按整數大小,而是字串對比,就是取第一個字元的ANSI碼對比,小的排前面,相同的話取第二個字元再比,如果要以整數數值比較,可以這樣
var a = [11,2,3,33445,5654,654]; a.sort(function(a,b) { return a - b; }); alert(a); // -> 2,3,11,654,5654,33445
sort()方法有個可選參數,就是程式碼裡的function,這是個簡單的例子,不可對非數字進行排序,非數字需要多做判斷,這裡就不多講
reverse
對數組進行反排序跟,sort()一樣,取第一字元ASCII值進行比較
var a = [11,3,5,66,4]; alert(a.reverse()); // -> 4,66,5,3,11
如果數組裡面還包含數組,則當為對象處理,並不會把元素解出來
var a = ['a','b','c','d','e','f','g',[4,11,33]]; alert(a.reverse()); // -> 4,11,33,g,f,e,d,c,b,a alert(a.join(" * ")); // -> 4,11,33 * g * f * e * d * c * b * a
按理應該是11排最後面,因為這裡把4,11,33 當做完整的對象比較,所以被排在第一位
看不明白的話,用join()串起來,就明了多
shift
##刪除數組第一個元素,並回傳該元素,跟pop差不多var a = ["aa","bb","cc"]; document.write(a.shift()); // -> aa document.write(a); // -> bb,cc註:當陣列為空時,回傳undefined
unshift##跟shift相反,在數組最前面添加元素,並返回數組新長度
var a = ["aa","bb","cc"]; document.write(a.unshift(11)); // -> 4 注:IE下返回undefined document.write(a); // -> 11,aa,bb,cc document.write(a.unshift([11,22])); // -> 5 document.write(a); // -> 11,22,11,aa,bb,cc document.write(a.unshift("cat")); // -> 6 document.write(a); // -> cat,11,22,11,aa,bb,cc
注意該方法,在IE下將返回undefined,貌似微軟的bug,我在firefox下則能正確發揮數組新長度
slice傳回數組片段
var a = ['a','b','c','d','e','f','g']; alert(a.slice(1,2)); // -> b alert(a.slice(2)); // -> c,d,e,f,g alert(a.slice(-4)); // -> d,e,f,g alert(a.slice(-2,-6)); // -> 空
a.slice(1,2),從下標為1開始,到下標為2之間的數,注意並不包含下標為2的元素
如果只有一個參數,則預設到數組最後-4是表示倒數第4個元素,所以傳回倒數的四個元素
最後一行,從倒數第2開始,因為是往後截取,所以顯然取不到前面的元素,所以回傳空數組,如果改成 a.slice(-6,-2) 則回傳b,c,d,e
從陣列刪除某段片段的元素,並傳回刪除的元素
var a = [1,2,3,4,5,6,7,8,9]; document.write(a.splice(3,2)); // -> 4,5 document.write(a); // -> 1,2,3,6,7,8,9 document.write(a.splice(4)); // -> 7,8,9 注:IE下返回空 document.write(a); // -> 1,2,3,6 document.write(a.splice(0,1)); // -> 1 document.write(a); // -> 2,3,6 document.write(a.splice(1,1,["aa","bb","cc"])); // -> 3 document.write(a); // -> 2,aa,bb,cc,6,7,8,9 document.write(a.splice(1,2,"ee").join("#")); // -> aa,bb,cc#6 document.write(a); // -> 2,ee,7,8,9 document.write(a.splice(1,2,"cc","aa","tt").join("#")); // -> ee#7 document.write(a); // -> 2,cc,aa,tt,8,9
注意該方法在IE下,第二個參數是必須的,不填則預設為0,例如a.splice(4),在IE下則回傳空,效果等同於a.splice(4,0)
toString#把數組轉為字串,不只數組,所有物件都可以使用該方法
var a = [5,6,7,8,9,["A","BB"],100]; document.write(a.toString()); // -> 5,6,7,8,9,A,BB,100 var b = new Date() document.write(b.toString()); // -> Sat Aug 8 17:08:32 UTC+0800 2009 var c = function(s){ alert(s); } document.write(c.toString()); // -> function(s){ alert(s); }
布林值則傳回true或false,物件則回傳[object objectname]
比較join( )方法,join()只對一維數組進行替換,而toString()則把整個數組(不管一維還是多維)完全平面化同時該方法可用於10進制、2進制、8進制、16進位轉換,例如:
var a = [5,6,7,8,9,"A","BB",100]; for(var i=0; i<a.length; i++){ document.write(a[i].toString() + " 的二进制是 " + a[i].toString(2) + " ,八进制是 " + a[i].toString(8) + " ,十六进制是 " + a[i].toString(16)); // -> 4,5 }
5 的二进制是 101 ,八进制是 5 ,十六进制是 5 6 的二进制是 110 ,八进制是 6 ,十六进制是 6 7 的二进制是 111 ,八进制是 7 ,十六进制是 7 8 的二进制是 1000 ,八进制是 10 ,十六进制是 8 9 的二进制是 1001 ,八进制是 11 ,十六进制是 9 A 的二进制是 A ,八进制是 A ,十六进制是 A BB 的二进制是 BB ,八进制是 BB ,十六进制是 BB 100 的二进制是 1100100 ,八进制是 144 ,十六进制是 64
#轉換只能在元素進行,如果對整個陣列進行轉換,則原封不動會傳回該陣列
toLocaleString傳回本地格式字串,主要用在Date物件上
var a = new Date(); document.write(a.toString()); // -> Sat Aug 8 17:28:36 UTC+0800 2009 document.write(a.toLocaleString()); // -> 2009年8月8日 17:28:36 document.write(a.toLocaleDateString()); // -> 2009年8月8日
差異在於,toString()傳回標準格式,toLocaleString()傳回本地格式完整日期(在【控制面板】>>【區域和語言選項】,透過修改[時間]和[長日期]格式),toLocaleDateString()跟toLocaleString()一樣,只是少了時間
valueOf根據不同物件回傳不同原始值,用於輸出的話跟toString()差不多,但是toString()是回傳string類型,而valueOf()是傳回原對象類型
var a = [1,2,3,[4,5,6,[7,8,9]]]; var b = new Date(); var c = true; var d = function(){ alert("sunnycat"); }; document.write(a.valueOf()); // -> 1,2,3,4,5,6,7,8,9 document.write(typeof (a.valueOf())); // -> object document.write(b.valueOf()); // -> 1249874470052 document.write(typeof(b.valueOf())); // -> number document.write(c.valueOf()); // -> true document.write(typeof(c.valueOf())); // -> boolean document.write(d.valueOf()); // -> function () { alert("sunnycat"); } document.write(typeof(d.valueOf())); // -> function
數組也是對象,所以typeof (a.valueOf())返回object,返回的依然是個多維數組
var a = [1,2,3,[4,5,6,[7,8,9]]]; var aa = a.valueOf(); document.write(aa[3][3][1]); // -> 8
Date對象返回的是距離1970年1月1日的毫秒數,Math和Error物件沒有valueOf方法。
以上是javascript常用的一些數組函數用法實例匯總的詳細內容。更多資訊請關注PHP中文網其他相關文章!