/*<br />由於javascript是一種無類型語言,所以一個數組的元素可以具有任意的資料類型,同一個數組的不同元素<br />可以具有不同的類型,數組的元素設定可以包含其他數組,這樣就可以建立一個複雜的數組了.<br />並且在這點上說javascript作為一種指令碼語言不同於那種嚴格的物件導向的c++.c#,java了.具有更高的靈活性.<br />*/<br />/*<br />在javascript1.1和其後的版本中,數組是用建構函式Array()和運算子new來建立,<br />可用以下的三種方式來建立javascript 中的數組.<br />*/<br />var a=new Array();<br />var b=new Array(5,4,3,"first","test,string");<br />var c=new Array(20);<br />a[1.23]="test";<br />document.write("<br /><br />a[1.23]="+a[1.23]);<br />/*<br />相信每位從強型別的程式設計語言學習javascript時,絕對會以為上面這種操作感到驚訝,<br />float資料也作數組的下標了,事實上並非如您所想<br />javascript在您是用負數,浮點數,(或布爾型,對象,其他值時),javascript會將它轉換為一個字串<br />用產生的字串作為對象的屬性名稱字,而不是定義了一個新的數組元素<br />上面的執行個體事實就是為a 建立了一個名為:"1.23"的屬性.<br />*/<br />document.write("<br /><br />a.length="+a.length);<br />document.write("<br /><br />b.length="+b.length);<br />document.write("<br /><br />c.length="+c.length);<br />a[3]="Test";<br />document.write("<br /><br />a[3]="+a[3]);<br />document.write("<br /><br />a.length="+a.length);<br />//以上測試也很明確我們用整數作為數組的下標是才會真正為數組添加一個元素,<br />//這裡用數組的長度來體現了javascript的數組中的奧妙。<br />//通過設定數組的length屬效能過截斷數組的長度。<br />a.length=3;<br />if (a[3]==undefined)<br />{<br />document.write("<br /><br />在a.length="+a.length+"後,a[3]="+a[3]);<br />}<br />else<br />{<br />document.write("<br /><br />在a.length="+a.length+"後,a[3]="+a[3]);<br />}<br />//這裡測試我們的多維陣列元素<br />/*<br />javascript中實際上是不支援多維陣列<br />但是我們將一個一維數組的元素再賦給其一個一維數組,這樣就看起來就實現了多維陣列了,但<br />實際上他還是個一維數組,這和我們理解c語言的數組時的那種想法一樣,但他們的實現機制是不一樣的。<br />*/<br />var g=new Array(3);<br />g[3]=a;<br />g[3][2]="Test"<br />document.write("<br /><br />g[3][2]="+g[3][2]);<br />//數組join()方法<br />for (var i=0;i<20 ;i++ )<br />{<br />c[i]=i;<br />document.write("<br />c[i]="+c[i]);<br />}<br />document.write("<br/><br/>c的元素join()方法後是:"+c.join());<br />//數組的reverse()方法<br />c.reverse();<br />document.write("<br /><br/>c的元素在reverse()方法再join()後的結果是:"+c.join("|"));<br />//concat()方法的測試<br />var h=new Array(1,2,3);<br />h= h.concat([4,5]);<br />//但是concat函數不會遞迴地展開一個元素為數組的數組。<br />h=h.concat(6,7,[9,[10,20]]);<br />document.write("<br /><br />h.length="+h.length+"<br /><br />"+h);<br />document.write("<br /><br />h[8]="+h[8]);</p><p>//slice()方法<br />document.write("<br>h.slice(4,5)="+h.slice(4,5));<br />document.write("h.slice(5,9)="+h.slice(5,9))<br />//slice()方法:返回的數組包含有第一個參數指定的元素和那個元素開始到第二個參數指定的<br />//元素為止的元素但不包含第二個參數所指定的元素。</p><p>//splice()方法<br />//splice()方法是插入或刪除數組元素通用的方法。<br />/*<br />splice函數第一個參數指定了要插入或刪除的元素在數組中的位置。<br />第二個參數指定了要從數組中刪除的元個數<br />在第二參數之後可以有任意多個參數,它們指定的是從第一個參數指定的位置處插入的元素。<br />第一個元素及後續元素,做出相應的移動。<br />*/<br />document.write("<br />h.splice(8,1)後的h為::"+h.splice(8,1));<br />//document.write("<br />h.splice(8,0,'a','b','Test')後的h為::"+h.splice(8,0,'a','b','Test'));<br />h.splice(7,0,'a','b','Test');<br />document.write("<br />h.splice(7,0,'a','b','Test')後的h為:"+h);</p><p>//javascript中的數組作為堆棧時和php類似<br />//這點有趣更有用。<br />//以下是作為堆棧是使用的小執行個體<br />/*<br />push方法是將一個或多個新元素附加到數組的尾部,然後返回數組的新長度。<br />pop將刪除數組的最後一個元素,堅守數組的長度,返回他刪除的值。<br />*/<br />var stack=new Array();<br />stack.push(1,2);<br />document.write("<br /><br />stack的元素是:"+stack);<br />document.write("<br /><br />stack.length="+stack.length);<br />document.write("<br /><br />stack.pop()返回的結果是:"+stack.pop());<br />document.write("<br /><br />stack.length="+stack.length);<br />//以下是作為隊列使用的小執行個體<br />/*<br />unshift方法將一個或多個元素添加到數組元素的頭部,然後把已有的元素移動到下標最大的位置已騰出空間<br />,它返回的是主族的新長度。<br />方法shift是刪除並返回數組的第一個元素,然後將後面的所有元素都向前移動以填補第一個元素留下的空白。<br />*/<br />var list=[];<br />list.unshift(6,2);<br />document.write("<br >list的內容為:"+list);<br />document.write("<br>list的shift方法是:"+list.shift());<br />//此外就剩下,我們在java中熟悉的toString()方法 了<br />//It's a piece of cake!<br />document.write(c.toString());<br />//說白了,其實數組的toString()方法和無參數的join()的效果是完全相同<br />//OK,this's chapter for Array,that's all!</p><p>//join 將數組的各個下標串聯起來,通俗一點講就是把數組各個元素串連成一個字串。<br />var arr = new Array("HTML","CSS","JavaScript","DOM");<br />var arr_str = arr.join();<br />document.write("<br /><br />list的內容為:"+arr_str);<br />/*<br />這裡arr是數組或者對象,通過join方法後,傳回值arr_str為字串類型。<br />這裡應該可以和split方法對比進行學習。<br />*/<br />/*<br />數組對象的3個屬性:length、prototype、constructor<br />1、length 屬性<br />length 屬性<br />Length屬性工作表示數組的長度,即其中元素的個數。因為數組的索引總是由0開始,所以一個數組的上下限分別是:0和length-1。<br />和其他大多數語言不同的是,JavaScript數組的length屬性是可變的,這一點需要特別注意。<br />當length屬性被設定得更大時,整個數組的狀態事實上不會發生變化,僅僅是length屬性變大;<br />當length屬性被設定得比原來小時,則原先數組中索引大於或等於length的元素的值全部被丟失。<br />下面是示範改變length屬性的例子:<br />var arr=[12,23,5,3,25,98,76,54,56,76];//定義了一個包含10個數位數組<br />alert(arr.length);//顯示數組的長度10<br />arr.length=12;//增大數組的長度<br />alert(arr.length);//顯示數組的長度已經變為12<br />alert(arr);//顯示第9個元素的值,為56<br />arr.length=5;//將數組的長度減少到5,索引等於或超過5的元素被丟棄<br />alert(arr);//顯示第9個元素已經變為"undefined"<br />arr.length=10;//將數組長度恢複為10<br />alert(arr);//雖然長度被恢複為10,但第9個元素卻無法收回,顯示"undefined"<br />由上面的代碼我們可以清楚的看到length屬性的性質。<br />但length對象不僅可以顯式的設定,它也有可能被隱式修改。<br />JavaScript中可以使用一個未聲明過的變數,同樣,也可以使用一個未定義的數組元素(指索引超過或等於length的元素),<br />這時,length屬性的值將被設定為所使用元素索引的值加1。<br />例如下面的代碼:<br />var arr=[12,23,5,3,25,98,76,54,56,76];//定義了一個包含10個數位數組<br />alert(arr.length);//顯示10<br />arr[15]=34;<br />alert(arr.length);//顯示16<br />代碼中同樣是先定義了一個包含10個數位數組,通過alert語句可以看出其長度為10。<br />隨後使用了索引為15的元素,將其賦值為15,即 arr[15]=34,這時再用alert語句輸出數組的長度,得到的是16。<br />無論如何,對於習慣於強型別編程的開發人員來說,這是一個很令人驚訝的特性。<br />事實上,使用new Array()形式建立的數組,其初始長度就是為0,正是對其中未定義元素的操作,才使數組的長度發生變化。<br />由上面的介紹可以看到,length屬性是如此的神奇,利用它可以方便的增加或者減少數組的容量。<br />因此對length屬性的深入瞭解,有助於在開發過程中靈活運用。<br />2、prototype 屬性<br />prototype 屬性<br />返回物件類型原型的引用。prototype 屬性是 object 共有的。<br />objectName.prototype<br />objectName 參數是object對象的名稱。<br />說明:<br />用 prototype 屬性提供對象的類的一組準系統。<br />對象的新執行個體“繼承”賦予該對象原型的操作。<br />對於數組對象,以以下例子說明prototype 屬性的用途。<br />給數組對象添加返回數組中最大元素值的方法。要完成這一點,聲明一個函數,將它加入 Array.prototype,並使用它。<br />function array_max( )<br />{<br />var i, max = this[0];<br />for (i = 1; i < this.length; i++)<br />{<br />if (max < this[i])<br />max = this[i];<br />}<br />return max;<br />}<br />Array.prototype.max = array_max;<br />var x = new Array(1, 2, 3, 4, 5, 6);<br />var y = x.max();<br />該代碼執行後,y 儲存數組 x 中的最大值,或說 6。<br />3、constructor 屬性<br />constructor 屬性<br />表示建立對象的函數。<br />object.constructor //object是對象或函數的名稱。<br />說明:<br />constructor 屬性是所有具有 prototype 的對象的成員。<br />它們包括除 Global 和 Math 對象以外的所有 JScript 固有對象。<br />constructor 屬性儲存了對構造特定對象執行個體的函數的引用。<br />例如:<br />x = new String("Hi");<br />if (x.constructor == String) // 進行處理(條件為真)。<br />//或<br />function MyFunc {<br /> // 函數體。<br />}<br />y = new MyFunc;<br />if (y.constructor == MyFunc) // 進行處理(條件為真)。<br />對於數組來說:<br />y = new Array();<br />if (arr.constructor == Array)alert("arr is an Array");<br />數組對象的8個分類及多個方法<br />1.數組的建立<br />var arrayObj = new Array(); //建立一個預設數組,長度是0<br />var arrayObj = new Array(size); //建立一個size長度的數組,注意Array的長度是可變的,所以不是上限,是長度<br />var arrayObj = new Array(item1,item2,); //建立一個數組並賦初值<br />要說明的是,雖然第二種方法建立數組指定了長度,但實際上所有情況下數組都是變長的。<br />也就是說即使指定了長度為5,仍然可以將元素儲存在規定長度以外的,注意:這時間長度度會隨之改變。<br />2、數組的元素的訪問<br />var ArrayItemValue=arrayObj;//擷取數組的元素值<br />arrayObj= "要賦予新值";//給數組元素賦予新的值<br />3、數組元素的添加<br />arrayObj.push(item1,item2,...);// 將參數添加到數組結尾,並返回數組新長度<br />例:<br />var a = [1,2,3,4,5];<br />a.push(6,7);//a結果就是:[1,2,3,4,5,6,7]<br />arrayObj.unshift(item1,item2,...);// 將參數添加到數組開始,數組中的元素自動後移,返回數組新長度<br />for(var temp in a){document.write("<br /><br />"+a[temp]);}<br />例:<br />var a = [1,2,3,4,5];<br />a.unshift(-2,-1);//a結果就是:[-2,-1,1,2,3,4,5]<br />for(var temp in a){document.write("<br /><br />"+a[temp]);}<br />arrayObj.splice(start,deleteCount,item1,item2,...);<br />//從下標start位置開始刪除 deleteCount個元素,並從該位置起插入item1,item2,...。<br />//插入位置及之後的元素自動後移,方法返回被刪除的項。<br />例:<br />var a = [1,2,3,4,5];<br />var b = a.splice(2,2,7,8,9);//a結果就是:[1,2,7,8,9,5],b結果就是5:[3,4]<br />另外注意:<br />var b = a.splice(0,1);//等同shift()方法<br />a.splice(0,0,-2,-1); var b = a.length;//等同unshift()方法<br />var b = a.splice(a.length-1,1);//等同pop()方法<br />a.splice(a.length,0,6,7);//等同push()方法<br />4、數組元素的刪除<br />arrayObj.pop();//刪除原數組最後一項;<br />例:<br />var a = [1,2,3,4,5];<br />a.pop(); //a結果就是:[1,2,3,4]<br />arrayObj.shift();//移除最前一個元素並返回該元素值,數組中元素自動前移<br />例:<br />var a = [1,2,3,4,5];<br />a.shift();//a結果就是:[2,3,4,5]<br />arrayObj.splice(start,deleteCount);//從下標start位置的刪除deleteCount個的元素,方法以數組形式返回所移除的元素<br />例:<br />var a = [1,2,3,4,5];<br />var b = a.shift(0,2); //a結果就是:[3,4,5],b結果就是:[1,2]<br />5、數組的截取和合并<br />arrayObj.slice(start[,end]);<br />//返回從原數組中從start下標開始到 end-1 下標之間的項組成的新數組,如果end不填寫則返回start下標開始之後的全部元素。<br />例:<br />var a = [1,2,3,4,5];<br />var b = a.slice(1,3);//a結果就是:[1,2,3,4,5],b結果就是:[2,3]<br />var b = a.slice(1); //a結果就是:[1,2,3,4,5],b結果就是:[2,3,4,5]<br />arrayObj.concat(item1,item2,...);//返回一個新數組,新數組是將參數添加到原數組中構成的,而原數組不變<br />例:<br />var a = [1,2,3,4,5];<br />var b = a.concat(6,7);//a結果就是:[1,2,3,4,5],b結果就是:[1,2,3,4,5,6,7]<br />6、數組的拷貝<br />arrayObj.slice(0);//返回數組的拷貝數組,注意是一個新的數組,不是指向<br />arrayObj.concat();//返回數組的拷貝數組,注意是一個新的數組,不是指向<br />7、數組元素的排序<br />arrayObj.reverse();//將數組反序,返回反序後的數組地址<br />例:<br />var a = [1,2,3,4,5];<br />var b = a.reverse();//a結果就是:[5,4,3,2,1],b結果就是:[5,4,3,2,1]<br />//注意,這裡返回的是數組地址,並非數組的拷貝,反序了之後如果原數組改變了,那麼反序的數組也隨便之改變<br />//在此之上再做如下操作<br />a.pop();//a結果就是:[5,4,3,2],b結果就是:[5,4,3,2]<br />//或者<br />b.pop();//a結果就是:[5,4,3,2],b結果就是:[5,4,3,2]<br />arrayObj.sort([orderfunction]);//對按指定的參數數組元素排序,返回排序後的數組地址<br />例:<br />//在arrayObj.reverse()例子中繼續做sort()<br />a.sort();//a結果就是:[2,3,4,5],b結果就是:[2,3,4,5]<br />要注意的是,在具體的數組中可以按照orderfunction參數指定的方法進行排序。<br />8、數組元素的字串化<br />arrayObj.join(separator);<br />//將數組的元素串連在一起組成一個字串,以separator為分隔字元,省略的話則用預設用逗號為分隔字元。<br />var a = [1,2,3,4,5];<br />var b = a.join("|"); //a結果就是:[1,2,3,4,5],b結果就是:"1|2|3|4|5"<br />toLocaleString 、toString 、valueOf:可以看作是join的特殊用法,不常用。<br />*/