Javascript Array小結
在JavaScript的幾個參考型別(Object,Array,Date,RegExp,Function,基本參考型別)中,Array類型應該是除了object應用的最多的類型了。與其他語言不同的是,ECMAscript(JavaScript)中的數組是沒有進行強定義的,也就是說,在JavaScript數組中每一項可以存任何的對象。
var test=['alpha','beta',3,false];alert(test);//['alpha','beta',3,false]
①數組的構建:
在js中構建數組的方式有兩種:
1.利用數組的建構函式
var test=new Array();
可以指定數組的大小或者數組中元素。
var test1=new Array(3);//指定大小var test2=new Array('demo1','demo2',222);//指定內容
1.利用數組字面量標記法:
var test=['alpha','beta',3,false];
在這裡得提到的是,js數組的length屬性不是一個唯讀屬性,也就是說,我們可以任意地去修改數組的長度:
var test=new Array('demo1','demo2',333);console.log(test.toString());//'demo1','demo2',333test[3]='我是第四個';console.log(test.toString());//'demo1','demo2',333,我是第四個
這樣也是不會報錯的。通過這一個屬性我們就可以在一個數組的最後一直填儲值。數組的最大長度為4294967295,這length基本已經已經滿足了所有的編程要求了。
②監測數組
如何判斷一個對象是否是一個數組?
利用關鍵字instanceof和Array.isArray();
var test=new Array('demo1','demo2',333);if(test instanceof Array){alert(test is a array);//test is a array}//該方法支援ie9+if(Array.isArray(test)){alert(test is a array);//test is a array}③ 轉換方法
幾乎所有的對象都具有toString(),valueOf(),toLocaleString()方法,調用數組的toString()方法會返回由數組中的每一項用字串形式拼接而成的一個以逗號分隔的字串。toString()和toLocaleString()一般來說都是返回相同的值,但是應用 的是時候會有細節問題,看下面的代碼:
var person1 = {toLocaleString: function() {return alpha;},toString: function() {return Beta;}}var person2 = {toLocaleString: function() {return alpha;},toString: function() {return Alpha;}}var people = [person1, person2];alert(people);alert(people.toString());alert(people.toLocaleString());
這裡定義了兩個對象person1和person2,分別為兩個對象定義了一個toString和toLocaleString方法,這兩個方法返回了不同的值。然後建立了一個數組用來存放兩個對象,當數組傳遞給alert的時候,輸出的結果是Beta,Alpha,這是因為這裡隱式地調用了toString方法,後面是顯示調用toString也是一樣。當數組調用toLocaleString的時候,輸出的是alpha,alpha,原因是調用可數組每一項的toLocaleString方法。
在預設情況下,toString,toLocaleString,valueOf方法都會以逗號分隔的字串形式返回數組項,如果不想用逗號,可以使用join方法。
var people=['alpha','Beta',3,'names'];console.log(people.join('||'));
如果數組的某一項是null或者undefined,那麼在以上的轉換方法中返回的結果都會以Null 字元串。
④棧方法
在JavaScript中,數組是可以當做棧來使用的,棧是一種LIFO的資料結構,也就是說最新添加的元素,最先被移除,而且所有的彈出,推入操作都是發生在一個叫棧頂的地方。JavaScript中提供給了push()和pop()方法來完成對棧的操作。
var newArr=[1,2,3,4,5];newArr.push(6);alert(newArr.toString());//1,2,3,4,5,6newArr.pop();alert(newArr.toString());//1,2,3,4,5
⑤隊列方法
既然可以當做棧來使用,那麼也就可以當做隊列來使用啦,隊列的規則是FILO,也就是說先進後出。JavaScript提供了shift()和push()來實現這一操作。
var newArr=[1,2,3,4,5];newArr.shift();alert(newArr.toString());//2,3,4,5newArr.push(6);alert(newArr.toString());//2,3,4,5,6
JavaScript還提供了一個unshift方法,也就是說在隊列的前面添加一個元素並且是長度加1.
var newArr=[1,2,3,4,5];newArr.shift();alert(newArr.toString());//2,3,4,5newArr.unshift(6,7);//6,7,2,3,4,5alert(newArr.toString());
綜合利用pop,push,shift,unshift就可以實現很多方法了,比如隊列的反向操作之類的。
⑥重排序方法
數組中本身就給了兩個重排序的方法,reverse(逆置)和sort(排序)方法。
var newArr=[1,2,3,4,5];var secArr=[1,3,5,7,2,4];newArr.reverse();secArr.sort();alert(secArr.toString());//1,2,3,4,5,7alert(newArr.toString());//5,4,3,2,1
關於sort方法,這樣看起來貌似是沒有問題的,但是其實sort方法的具體實現是:調用每個數組項的toString()方法。也就是說,sort是按照比較字串大小進行排序的。
var secArr=[1,3,5,7,2,4,11];secArr.sort();alert(secArr.toString());//1,11,2,3,4,5,7
這種排序方式在大多數情況下都是不符合要求,那麼應該怎麼做呢?實際上sort()方法提供了一個可參考的比較函數,這個函數傳入兩個參數,如果第一個參數應該位於第二個參數之前,那麼就會返回-1,相等返回0,位於之後返回1,那麼我們只要重寫這個方法,並且傳入sort()即可按照我們自己的方式完成sort操作。
var secArr=[1,3,5,7,2,4,11];secArr.sort(compare);alert(secArr.toString());//1,2,3,4,5,7function compare(value1,value2){return value1-value2;}