Object類型
Object類型是JavaScript中使用最多的一種類型。雖然Object的實例不具備多少功能,但對於在應用程序中存儲和傳輸數據而言,它確實是非常理想的選擇。
創建Object實例的方式有兩種,第一種是使用new操作符後跟Object構造函數。
復制代碼 代碼如下:
var person = new Object();
person.name = "tt";
person.age = 12;
另一種方式是使用對象字面量表示法。
復制代碼 代碼如下:
var person = {
name : 'tt',
age : 12
}
另外,使用對象字面量語法時,如果留空其花括號,則可以定義值包含默認屬性和方法的對象。
var person = {}; //與new Object()相同
person.name = "tt";
person.age = 12;
雖然可以使用前面介紹的任何一種方法來定義對象,但開發人員更青睐第二種方法(對象字面量語法),因為這種語法要求的代碼量少,而且能給人封裝數據的感覺。實際上,對象字面量也是向函數傳遞大量可選參數的首選方式,例如:
復制代碼 代碼如下:
function showInfo(args)
{
if(args.name != undefined)
{
alert(args.name);
}
if(args.age != undefined)
{
alert(args.age);
}
}
showInfo({
name:'name',
age:12
});
showInfo({name:'name'});
一般來說,訪問對象屬性時使用的都是點表示法,這也是很多面向對象語言中通用的語法。不過,在JavaScript也可以使用方括號表示法來訪問對象的屬性。例如:
復制代碼 代碼如下:
alert(person.name);
alert(person['name']);
從功能上看,這兩種訪問對象屬性的方法沒有任何區別。但方括號語法的主要優點是可以通過變量來訪問屬性。
復制代碼 代碼如下:
var propertyName = 'name';
alert(person[propertyName]);
通常,除非必須使用變量來訪問屬性,否則我們建議使用點表示法。
Array類型
JavaScript中的數組與其他多數語言中的數組有著相當大的區別。雖然JavaScript數組與其他語言中的數組都是數據的有序列表,但與其他語言不同的是,JavaScript數組的每一項可以保持任何類型的數據。也就是說,可以用數組的第一個位置來保存字符串,用第二個位置來保存數值,用第三個位置來保存對象。而且,JavaScript數組的大小是可以動態調整的,即可以隨著數據的添加自動增長以容納新增數據。
創建數組的基本方式有兩種。第一種是使用Array構造函數。
復制代碼 代碼如下:
var colors1 = new Array();
var colors2 = new Array(20);
var colors3 = new Array('red','blue','yellow');
創建數組的第二種基本方式是使用數組字面量表示法。
復制代碼 代碼如下:
var colors1 = [];
var colors2 = ['red','blue','yellow'];
在讀取和設置數組的值時,要使用方括號並提供相應值的基於0的數字索引。
復制代碼 代碼如下:
var colors = ['red','blue','yellow']; //定義一個字符串數組
alert(colors[0]); //顯示第一項
colors[2] = 'green'; //修改第三項
colors[3] = 'black'; //新增第四項
數組的長度保存在其length屬性中,這個屬性始終會返回0或更大的值。
復制代碼 代碼如下:
var colors = ['red','blue','yellow'];
var names = [];
alert(colors.length); //3
alert(names.length); //0
數組的length屬性很有特點——它不是只讀的。因此,通過設置這個屬性,可以從數組的末尾移除項或想數組中添加新項。
復制代碼 代碼如下:
var colors = ['red','blue','yellow'];
colors.length = 2;
alert(colors[2]); //undefined
這個例子中的數組colors一開始有3個值。將其length屬性設置為2會移除最後一項,結果再訪問colors[2]就會顯示undefined了。
利用length屬性也可以方便地在數組末尾添加新項。
復制代碼 代碼如下:
var colors = ['red','blue','yellow'];
colors[colors.length] = 'green'; //在位置3添加一種顏色
colors[colors.length] = 'black'; //再在位置4添加一種顏色
由於數組最後一項的索引始終是length-1,因此下一個新項的位置就是length。
轉換方法
所有對象都具有toLocaleString()、toString()和valueOf()方法。其中,調用數組的toString()和valueOf()方法會返回相同的值,即由數組中每個值的字符串形成拼接而成的一個以逗號分隔的字符串。實際上,為了創建這個字符串會調用數組每一項的toString()方法。
復制代碼 代碼如下:
var colors = ['red','blue','yellow'];
alert(colors.toString()); //red,blue,yellow
alert(colors.valueOf()); //red,blue,yellow
alert(colors); //red,blue,yellow
我們首先顯式地調用了toString()和valueOf()方法,以便返回數組的字符串表示,每個值的字符串表示拼接成了一個字符串,中間以逗號分隔。最後一行代碼直接將數組傳遞給了alert()。由於alert()要接收字符串參數,所有它會在後台調用toString()方法,由此會得到與直接調用toString()方法相同的結果。
另外,toLocaleString()方法經常也會返回與toString()和valueOf()方法相同的值,但也不總是如此。當調用數組的toLocaleString()方法時,它也會創建一個數組值的以逗號分隔的字符串。而與前兩個方法唯一的不同之處在於,這一次為了取得每一項的值,調用的是每一項的toLocaleString()方法,而不是toString()方法。例如:
復制代碼 代碼如下:
var person1 = {
toLocaleString : function(){
return "person1 : toLocaleString";
},
toString : function(){
return "person1 : toString";
}
};
var person2 = {
toLocaleString : function(){
return "person2 : toLocaleString";
},
toString : function(){
return "person2 : toString";
}
};
var people = [person1,person2];
alert(people); //person1 : toString,person2 : toString
alert(people.toString()); //person1 : toString,person2 : toString
alert(people.toLocaleString()); //person1 : toLocaleString,person2 : toLocaleString
數組繼承的toLocaleString()、toString()和valueOf()方法,在默認情況下都會以逗號分隔的字符串的形式返回數組項。而如果使用join()方法,則可以使用不同的分隔符來構建這個字符串。
復制代碼 代碼如下:
var colors = ['red','blue','yellow'];
alert(colors.join(',')); //red,blue,yellow
alert(colors.join('||')); //red||blue||yellow
注意:如果數組中的某一項的值是null或者undefined,那麼該值在join()、toString()、toLocaleString()和valueOf()方法返回的結果中以空字符串表示。
棧方法
JavScript數組也提供了一種讓數組的行為類似於其他數據結構的方法。具體來說,數組可以表現得就像棧一樣,後者是一種可以限制插入和刪除項的數據結構。棧是一種後進先出後進先出的數據結構。而棧中項的插入(叫做推入)和移除(叫做彈出),只發生在一個位置——棧的頂部。JavaScript提供了push()和pop()方法,以便實現類似的棧行為。
push()方法可以接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改後數組的長度。而pop()方法則從數組末尾移除最後一項,減少數組的length值,然後返回移除的項。
復制代碼 代碼如下:
var colors = new Array(); //創建一個數組
var count = colors.push('red','blue'); //推入兩項
alert(count); //2
count = colors.push('yellow'); //再推入一項
alert(count); //3
var item = colors.pop(); //取得最後一項
alert(item); //yellow
alert(colors.length); //2
隊列方法
隊列數據結構的訪問規則是先進先出。隊列在列表的末端添加項,從列表的前端移除項。由於push()是向數組末端添加項的方法,因此要模擬隊列只需一個從數組前端取得項的方法。實現這一操作的數組方法就是shift(),它能夠移除數組中的第一個項並返回該項,同時將數組長度減1。結合使用shift()和push()方法,可以像使用隊列一樣使用數組:
復制代碼 代碼如下:
var colors = new Array(); //創建一個數組
var count = colors.push('red','blue'); //推入兩項
alert(count); //2
count = colors.push('yellow'); //再推入一項
alert(count); //3
var item = colors.shift(); //取得第一項
alert(item); //red
alert(colors.length); //2
JavaScript還為數組提供了一個unshift()方法。顧名思義,unshift()與shift()的用途相反:它能在數組前端添加任意個項並返回新數組的長度。因此,同時使用unshift()和pop()方法,可以從反方向來模擬隊列,即在數組的前端添加項,從數組的末端移除項,例如:
復制代碼 代碼如下:
var colors = new Array(); //創建一個數組
var count = colors.unshift('red','blue'); //推入兩項
alert(count); //2
count = colors.unshift('yellow'); //再推入一項
alert(count); //3
var item = colors.pop(); //取得第一項
alert(item); //blue
alert(colors.length); //2
注意:IE對JavaScript的實現中存在一個偏差,其unshift()方法總是返回undefined而不是數組的新長度。
重排序方法
數組中已經存在兩個可以直接用來重排序的方法:reverse()和sort(),reverse()方法會反轉數組項的順序。
復制代碼 代碼如下:
var values = [1,2,3,4,5];
values.reverse();
alert(values); //5,4,3,2,1
在默認情況下,sort()方法按升序排列數組項——即最小的值位於最前面,最大的值排在最後面。為了實現排序,sort()方法會調用每個數組項的toString()轉型方法,然後比較得到的字符串,以確定如何排序。即使數組中的每一項都是數值,sort()方法比較的也是字符串,如下所示:
復制代碼 代碼如下:
var values = [0,1,5,10,15];
values.sort();
alert(values); //0,1,10,15,5
可見,即使例子中值的順序沒有問題,但sort()方法也會根據測試字符串的結果改變原來的順序。因為數值5雖然小於10,但在進行字符串比較時,“10”則位於“5”的前面。因此sort()方法可以接收一個比較函數作為參數,以便我們指定哪個值位於哪個值的前面。
復制代碼 代碼如下:
function compare(value1,value2){
if(value1 < value2){
return 1;
} else if(value1 > value2){
return -1;
} else{
return 0;
}
}
var values = [0,1,5,10,15];
values.sort(compare);
alert(values); //15,10,5,1,0
對於數值類型或者其valueOf()方法會返回數值類型的對象類型,可以使用一個更簡單的比較函數。這個函數主要用第二個值減第一個值即可。
復制代碼 代碼如下:
function compare(value1,value2){
return value2 - value1;
}
操作方法
JavaScript對操作數組提供了很多方法。其中,concat()方法可以基於當前數組中的所有項創建一個新數組,如果傳遞給concat()方法的是一或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。如果傳遞的值不是數組,這些值就會被簡單地添加到結果數組的末尾。
復制代碼 代碼如下:
var colors = ['red','green','blue'];
var colors2 = colors.concat('yellow',['black' , 'brown']);
alert(colors); //red,green,blue
alert(colors2); //red,green,blue,yellow,black,brown
slice()方法能夠基於當前數組中的一或多個項創建一個新數組。slice()方法可以接受一或兩個參數,即要返回項的起始和結束位置。在只有一個參數的情況下,slice()方法返回從該參數指定位置開始到當前數組末尾的所有項。如果有兩個參數,該方法返回起始和結束位置之前的項——但不包括結束位置的項。
復制代碼 代碼如下:
var colors = ['red','green','blue','yellow','black','brown'];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);
alert(colors2); //green,blue,yellow,black,brown
alert(colors3); //green,blue,yellow
下面我們來介紹splice()方法,這個方法恐怕要算是最強大的數組方法了,splice()主要用途是向數組的中部插入項,但使用這種方法的方式則有如下3種。
刪除——可以刪除任意數量的項,只需指定2個參數:要刪除的第一項的位置和要刪除的項數。例如,splice(0,2)會刪除數組中的前兩項。
插入——可以向指定位置插入任意數量的項,只需提供3個參數:起始位置、0(要刪除的項數)、要插入的項。如果要插入多個項,可以再傳入第四、第五,以致任意多個項。例如,splice(2,0,'red','green')會從當前數組的位置2開始插入字符串'red'和'green'。
替換——可以向指定位置插入任意數量的項,且同時刪除任意數量的項,只需指定3個參數:起始位置、要刪除的項數和要插入的任意數量的項。插入的項數不必與刪除的項數相等。例如,splice(2,1,'red','green')會刪除當前數組位置2的項,然後再從位置2開始插入字符串'red'和'green'。
復制代碼 代碼如下:
var colors = ['red','green','blue'];
var removed = colors.splice(0,1); //刪除第一項
alert(colors); //green,blue
alert(removed); //red
removed = colors.splice(1,0,'yellow','black'); //從位置1開始插入兩項
alert(colors); //green,yellow,black,blue
alert(removed); //返回一個空數組
removed = colors.splice(1,1,'red','brown'); //插入兩項,刪除一項
alert(colors); //green,red,brown,black,blue
alert(removed); //yellow
Date類型
JavaScript中的Date類型是在早期Java中的java.util.Date類基礎上構建的。為此,Date類型使用自UTC 1970年1月1日零時開始經過的毫秒數來保存日期。在使用這種數據存儲格式的條件下,Date類型保存的日期能夠精確到1970年1月1日之前或之後的285 616年。
要創建一個日期對象,使用new操作符和Date構造函數即可。
var now = new Date();
在調用Date構造函數而不傳遞參數的情況下,新創建的對象自動獲得當前日期和時間。如果想根據特定的日期和時間創建日期對象,必須傳入表示該日期的毫秒數。為了簡化這一計算過程,JavaScript提供了兩個方法:Date.parse()和Date.UTC()。
其中,Date.parse()方法接收一個表示日期的字符串參數,然後嘗試根據這個字符串返回相應日期的毫秒數。JavaScript沒有定義Date.parse()應該支持哪種格式,因此這個方法的行為因實現而異,而且通常是因地區而異。將地區設置為美國的浏覽器通常都接受下列日期格式:
● "月/日/年",如:6/13/2204
● "英文月名 日,年",如:January 12,2004
● "英文星期幾 英文月名 日 年 時:分:秒 時區",如:Tue May 25 2004 00:00:00 GMT-0700
例如,要為2004年5月25日創建一個日期對象,可以使用下面的代碼:
var someDate = new Date(Date.parse("May 25 , 2004"));
如果傳入Date.parse()方法的字符串不能表示日期,那麼它會返回NaN。實際上,如果直接將表示日期的字符串傳遞給Date構造函數,也會在後台調用Date.parse()。換句話說,下面的代碼與前面的例子是等價的:
var someDate = new Date('May 25 , 2004');
Date.UTC()方法同樣也返回表示日期的毫秒數,但它與Date.parse()在構建值時使用不同的信息。Date.UTC()的參數分別是年份、基於0的月份(一月是0,二月是1,以此類推)。月中的哪一天(1到31)、小時數(0到23)、分鐘、秒以及毫秒數。在這些參數中,只有前兩個參數(年和月)是必需的。如果沒有提供月中的天數,則假設天數為1;如果省略其他參數,則統統假設為0。
復制代碼 代碼如下:
//GMT時間2000年1月1日零時
var y2k = new Date(Date.UTC(2000, 0));
//GMT時間2005年5月5日下午5:55:55
var allFives = new Date(Date.UTC(2005,4,5,17,55,55));
如同模仿Date.parse()一樣,Date構造函數也會模仿Date.UTC(),但有一點明顯不同:日期和時間都基於本地時區而非GMT來創建的。可以將前面的例子重寫如下:
//本地時間2000年1月1日零時
var y2k = new Date(2000,0);
//本地時間2005年5月5日下午5:55:55
var allFives = new Date(2005,4,5,17,55,55);
Date類型還有一些專門用於將日期格式化為字符串的方法,這些方法如下:
● toDateString()——以特定於實現的格式顯示星期幾、月、日和年
● toTimeString()——以特定於實現的格式顯示時、分、秒和時區
● toLocaleDateString()——以特定於地區的格式顯示星期幾、月、日和年
● toLocaleTimeString()——以特定於實現的格式顯示時、分、秒
● toUTCString()——以特定於實現的格式完整的UTC日期
以上這些字符串格式方法的輸出也是因浏覽器而異的,因此沒有哪一個方法能夠用來在用戶界面中顯示一致的日期信息。
以下是Date類型的所有方法: