欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript之引用類型介紹

 更新時(shí)間:2012年08月10日 10:41:32   作者:  
引用類型通常叫作類(class),也就是說,遇到引用值時(shí),所處理的就是對象。

Object類型
  Object類型是JavaScript中使用最多的一種類型。雖然Object的實(shí)例不具備多少功能,但對于在應(yīng)用程序中存儲和傳輸數(shù)據(jù)而言,它確實(shí)是非常理想的選擇。

  創(chuàng)建Object實(shí)例的方式有兩種,第一種是使用new操作符后跟Object構(gòu)造函數(shù)。

復(fù)制代碼 代碼如下:

var person = new Object();
person.name = "tt";
person.age = 12;

  另一種方式是使用對象字面量表示法。
復(fù)制代碼 代碼如下:

var person = {
name : 'tt',
age : 12
}

  另外,使用對象字面量語法時(shí),如果留空其花括號,則可以定義值包含默認(rèn)屬性和方法的對象。

var person = {}; //與new Object()相同
person.name = "tt";
person.age = 12;

  雖然可以使用前面介紹的任何一種方法來定義對象,但開發(fā)人員更青睞第二種方法(對象字面量語法),因?yàn)檫@種語法要求的代碼量少,而且能給人封裝數(shù)據(jù)的感覺。實(shí)際上,對象字面量也是向函數(shù)傳遞大量可選參數(shù)的首選方式,例如:
復(fù)制代碼 代碼如下:

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'});

 一般來說,訪問對象屬性時(shí)使用的都是點(diǎn)表示法,這也是很多面向?qū)ο笳Z言中通用的語法。不過,在JavaScript也可以使用方括號表示法來訪問對象的屬性。例如:
復(fù)制代碼 代碼如下:

alert(person.name);
alert(person['name']);

  從功能上看,這兩種訪問對象屬性的方法沒有任何區(qū)別。但方括號語法的主要優(yōu)點(diǎn)是可以通過變量來訪問屬性。
復(fù)制代碼 代碼如下:

var propertyName = 'name';
alert(person[propertyName]);

  通常,除非必須使用變量來訪問屬性,否則我們建議使用點(diǎn)表示法。

Array類型
  JavaScript中的數(shù)組與其他多數(shù)語言中的數(shù)組有著相當(dāng)大的區(qū)別。雖然JavaScript數(shù)組與其他語言中的數(shù)組都是數(shù)據(jù)的有序列表,但與其他語言不同的是,JavaScript數(shù)組的每一項(xiàng)可以保持任何類型的數(shù)據(jù)。也就是說,可以用數(shù)組的第一個(gè)位置來保存字符串,用第二個(gè)位置來保存數(shù)值,用第三個(gè)位置來保存對象。而且,JavaScript數(shù)組的大小是可以動態(tài)調(diào)整的,即可以隨著數(shù)據(jù)的添加自動增長以容納新增數(shù)據(jù)。

  創(chuàng)建數(shù)組的基本方式有兩種。第一種是使用Array構(gòu)造函數(shù)。
復(fù)制代碼 代碼如下:

var colors1 = new Array();
var colors2 = new Array(20);
var colors3 = new Array('red','blue','yellow');

  創(chuàng)建數(shù)組的第二種基本方式是使用數(shù)組字面量表示法。
復(fù)制代碼 代碼如下:

var colors1 = [];
var colors2 = ['red','blue','yellow'];

  在讀取和設(shè)置數(shù)組的值時(shí),要使用方括號并提供相應(yīng)值的基于0的數(shù)字索引。
復(fù)制代碼 代碼如下:

var colors = ['red','blue','yellow']; //定義一個(gè)字符串?dāng)?shù)組
alert(colors[0]); //顯示第一項(xiàng)
colors[2] = 'green'; //修改第三項(xiàng)
colors[3] = 'black'; //新增第四項(xiàng)

  數(shù)組的長度保存在其length屬性中,這個(gè)屬性始終會返回0或更大的值。
復(fù)制代碼 代碼如下:

var colors = ['red','blue','yellow'];
var names = [];
alert(colors.length); //3
alert(names.length); //0

  數(shù)組的length屬性很有特點(diǎn)——它不是只讀的。因此,通過設(shè)置這個(gè)屬性,可以從數(shù)組的末尾移除項(xiàng)或想數(shù)組中添加新項(xiàng)。
復(fù)制代碼 代碼如下:

var colors = ['red','blue','yellow'];
colors.length = 2;
alert(colors[2]); //undefined

  這個(gè)例子中的數(shù)組colors一開始有3個(gè)值。將其length屬性設(shè)置為2會移除最后一項(xiàng),結(jié)果再訪問colors[2]就會顯示undefined了。

  利用length屬性也可以方便地在數(shù)組末尾添加新項(xiàng)。
復(fù)制代碼 代碼如下:

var colors = ['red','blue','yellow'];
colors[colors.length] = 'green'; //在位置3添加一種顏色
colors[colors.length] = 'black'; //再在位置4添加一種顏色

  由于數(shù)組最后一項(xiàng)的索引始終是length-1,因此下一個(gè)新項(xiàng)的位置就是length。

轉(zhuǎn)換方法

所有對象都具有toLocaleString()、toString()和valueOf()方法。其中,調(diào)用數(shù)組的toString()和valueOf()方法會返回相同的值,即由數(shù)組中每個(gè)值的字符串形成拼接而成的一個(gè)以逗號分隔的字符串。實(shí)際上,為了創(chuàng)建這個(gè)字符串會調(diào)用數(shù)組每一項(xiàng)的toString()方法。
復(fù)制代碼 代碼如下:

var colors = ['red','blue','yellow'];
alert(colors.toString()); //red,blue,yellow
alert(colors.valueOf()); //red,blue,yellow
alert(colors); //red,blue,yellow

  我們首先顯式地調(diào)用了toString()和valueOf()方法,以便返回?cái)?shù)組的字符串表示,每個(gè)值的字符串表示拼接成了一個(gè)字符串,中間以逗號分隔。最后一行代碼直接將數(shù)組傳遞給了alert()。由于alert()要接收字符串參數(shù),所有它會在后臺調(diào)用toString()方法,由此會得到與直接調(diào)用toString()方法相同的結(jié)果。

  另外,toLocaleString()方法經(jīng)常也會返回與toString()和valueOf()方法相同的值,但也不總是如此。當(dāng)調(diào)用數(shù)組的toLocaleString()方法時(shí),它也會創(chuàng)建一個(gè)數(shù)組值的以逗號分隔的字符串。而與前兩個(gè)方法唯一的不同之處在于,這一次為了取得每一項(xiàng)的值,調(diào)用的是每一項(xiàng)的toLocaleString()方法,而不是toString()方法。例如:
復(fù)制代碼 代碼如下:

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

  數(shù)組繼承的toLocaleString()、toString()和valueOf()方法,在默認(rèn)情況下都會以逗號分隔的字符串的形式返回?cái)?shù)組項(xiàng)。而如果使用join()方法,則可以使用不同的分隔符來構(gòu)建這個(gè)字符串。
復(fù)制代碼 代碼如下:

var colors = ['red','blue','yellow'];
alert(colors.join(',')); //red,blue,yellow
alert(colors.join('||')); //red||blue||yellow

  注意:如果數(shù)組中的某一項(xiàng)的值是null或者undefined,那么該值在join()、toString()、toLocaleString()和valueOf()方法返回的結(jié)果中以空字符串表示。

  棧方法


JavScript數(shù)組也提供了一種讓數(shù)組的行為類似于其他數(shù)據(jù)結(jié)構(gòu)的方法。具體來說,數(shù)組可以表現(xiàn)得就像棧一樣,后者是一種可以限制插入和刪除項(xiàng)的數(shù)據(jù)結(jié)構(gòu)。棧是一種后進(jìn)先出后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。而棧中項(xiàng)的插入(叫做推入)和移除(叫做彈出),只發(fā)生在一個(gè)位置——棧的頂部。JavaScript提供了push()和pop()方法,以便實(shí)現(xiàn)類似的棧行為。

  push()方法可以接收任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長度。而pop()方法則從數(shù)組末尾移除最后一項(xiàng),減少數(shù)組的length值,然后返回移除的項(xiàng)。
復(fù)制代碼 代碼如下:

var colors = new Array(); //創(chuàng)建一個(gè)數(shù)組
var count = colors.push('red','blue'); //推入兩項(xiàng)
alert(count); //2
count = colors.push('yellow'); //再推入一項(xiàng)
alert(count); //3
var item = colors.pop(); //取得最后一項(xiàng)
alert(item); //yellow
alert(colors.length); //2


  隊(duì)列方法

  隊(duì)列數(shù)據(jù)結(jié)構(gòu)的訪問規(guī)則是先進(jìn)先出。隊(duì)列在列表的末端添加項(xiàng),從列表的前端移除項(xiàng)。由于push()是向數(shù)組末端添加項(xiàng)的方法,因此要模擬隊(duì)列只需一個(gè)從數(shù)組前端取得項(xiàng)的方法。實(shí)現(xiàn)這一操作的數(shù)組方法就是shift(),它能夠移除數(shù)組中的第一個(gè)項(xiàng)并返回該項(xiàng),同時(shí)將數(shù)組長度減1。結(jié)合使用shift()和push()方法,可以像使用隊(duì)列一樣使用數(shù)組:

復(fù)制代碼 代碼如下:

var colors = new Array(); //創(chuàng)建一個(gè)數(shù)組
var count = colors.push('red','blue'); //推入兩項(xiàng)
alert(count); //2
count = colors.push('yellow'); //再推入一項(xiàng)
alert(count); //3
var item = colors.shift(); //取得第一項(xiàng)
alert(item); //red
alert(colors.length); //2

  JavaScript還為數(shù)組提供了一個(gè)unshift()方法。顧名思義,unshift()與shift()的用途相反:它能在數(shù)組前端添加任意個(gè)項(xiàng)并返回新數(shù)組的長度。因此,同時(shí)使用unshift()和pop()方法,可以從反方向來模擬隊(duì)列,即在數(shù)組的前端添加項(xiàng),從數(shù)組的末端移除項(xiàng),例如:

復(fù)制代碼 代碼如下:

var colors = new Array(); //創(chuàng)建一個(gè)數(shù)組
var count = colors.unshift('red','blue'); //推入兩項(xiàng)
alert(count); //2
count = colors.unshift('yellow'); //再推入一項(xiàng)
alert(count); //3
var item = colors.pop(); //取得第一項(xiàng)
alert(item); //blue
alert(colors.length); //2

  注意:IE對JavaScript的實(shí)現(xiàn)中存在一個(gè)偏差,其unshift()方法總是返回undefined而不是數(shù)組的新長度。

  重排序方法

  數(shù)組中已經(jīng)存在兩個(gè)可以直接用來重排序的方法:reverse()和sort(),reverse()方法會反轉(zhuǎn)數(shù)組項(xiàng)的順序。
復(fù)制代碼 代碼如下:

var values = [1,2,3,4,5];
values.reverse();
alert(values); //5,4,3,2,1

  在默認(rèn)情況下,sort()方法按升序排列數(shù)組項(xiàng)——即最小的值位于最前面,最大的值排在最后面。為了實(shí)現(xiàn)排序,sort()方法會調(diào)用每個(gè)數(shù)組項(xiàng)的toString()轉(zhuǎn)型方法,然后比較得到的字符串,以確定如何排序。即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort()方法比較的也是字符串,如下所示:
復(fù)制代碼 代碼如下:

var values = [0,1,5,10,15];
values.sort();
alert(values); //0,1,10,15,5

  可見,即使例子中值的順序沒有問題,但sort()方法也會根據(jù)測試字符串的結(jié)果改變原來的順序。因?yàn)閿?shù)值5雖然小于10,但在進(jìn)行字符串比較時(shí),“10”則位于“5”的前面。因此sort()方法可以接收一個(gè)比較函數(shù)作為參數(shù),以便我們指定哪個(gè)值位于哪個(gè)值的前面。

復(fù)制代碼 代碼如下:

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

  對于數(shù)值類型或者其valueOf()方法會返回?cái)?shù)值類型的對象類型,可以使用一個(gè)更簡單的比較函數(shù)。這個(gè)函數(shù)主要用第二個(gè)值減第一個(gè)值即可。
復(fù)制代碼 代碼如下:

function compare(value1,value2){
return value2 - value1;
}


  操作方法

  JavaScript對操作數(shù)組提供了很多方法。其中,concat()方法可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新數(shù)組,如果傳遞給concat()方法的是一或多個(gè)數(shù)組,則該方法會將這些數(shù)組中的每一項(xiàng)都添加到結(jié)果數(shù)組中。如果傳遞的值不是數(shù)組,這些值就會被簡單地添加到結(jié)果數(shù)組的末尾。
復(fù)制代碼 代碼如下:

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()方法能夠基于當(dāng)前數(shù)組中的一或多個(gè)項(xiàng)創(chuàng)建一個(gè)新數(shù)組。slice()方法可以接受一或兩個(gè)參數(shù),即要返回項(xiàng)的起始和結(jié)束位置。在只有一個(gè)參數(shù)的情況下,slice()方法返回從該參數(shù)指定位置開始到當(dāng)前數(shù)組末尾的所有項(xiàng)。如果有兩個(gè)參數(shù),該方法返回起始和結(jié)束位置之前的項(xiàng)——但不包括結(jié)束位置的項(xiàng)。

復(fù)制代碼 代碼如下:

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()方法,這個(gè)方法恐怕要算是最強(qiáng)大的數(shù)組方法了,splice()主要用途是向數(shù)組的中部插入項(xiàng),但使用這種方法的方式則有如下3種。

  刪除——可以刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù):要刪除的第一項(xiàng)的位置和要刪除的項(xiàng)數(shù)。例如,splice(0,2)會刪除數(shù)組中的前兩項(xiàng)。

  插入——可以向指定位置插入任意數(shù)量的項(xiàng),只需提供3個(gè)參數(shù):起始位置、0(要刪除的項(xiàng)數(shù))、要插入的項(xiàng)。如果要插入多個(gè)項(xiàng),可以再傳入第四、第五,以致任意多個(gè)項(xiàng)。例如,splice(2,0,'red','green')會從當(dāng)前數(shù)組的位置2開始插入字符串'red'和'green'。

  替換——可以向指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定3個(gè)參數(shù):起始位置、要刪除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)。插入的項(xiàng)數(shù)不必與刪除的項(xiàng)數(shù)相等。例如,splice(2,1,'red','green')會刪除當(dāng)前數(shù)組位置2的項(xiàng),然后再從位置2開始插入字符串'red'和'green'。
復(fù)制代碼 代碼如下:

var colors = ['red','green','blue'];
var removed = colors.splice(0,1); //刪除第一項(xiàng)
alert(colors); //green,blue
alert(removed); //red
removed = colors.splice(1,0,'yellow','black'); //從位置1開始插入兩項(xiàng)
alert(colors); //green,yellow,black,blue
alert(removed); //返回一個(gè)空數(shù)組
removed = colors.splice(1,1,'red','brown'); //插入兩項(xiàng),刪除一項(xiàng)
alert(colors); //green,red,brown,black,blue
alert(removed); //yellow


Date類型

  JavaScript中的Date類型是在早期Java中的java.util.Date類基礎(chǔ)上構(gòu)建的。為此,Date類型使用自UTC 1970年1月1日零時(shí)開始經(jīng)過的毫秒數(shù)來保存日期。在使用這種數(shù)據(jù)存儲格式的條件下,Date類型保存的日期能夠精確到1970年1月1日之前或之后的285 616年。

  要創(chuàng)建一個(gè)日期對象,使用new操作符和Date構(gòu)造函數(shù)即可。

var now = new Date();
  在調(diào)用Date構(gòu)造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對象自動獲得當(dāng)前日期和時(shí)間。如果想根據(jù)特定的日期和時(shí)間創(chuàng)建日期對象,必須傳入表示該日期的毫秒數(shù)。為了簡化這一計(jì)算過程,JavaScript提供了兩個(gè)方法:Date.parse()和Date.UTC()。

  其中,Date.parse()方法接收一個(gè)表示日期的字符串參數(shù),然后嘗試根據(jù)這個(gè)字符串返回相應(yīng)日期的毫秒數(shù)。JavaScript沒有定義Date.parse()應(yīng)該支持哪種格式,因此這個(gè)方法的行為因?qū)崿F(xiàn)而異,而且通常是因地區(qū)而異。將地區(qū)設(shè)置為美國的瀏覽器通常都接受下列日期格式:

  ● "月/日/年",如:6/13/2204

  ● "英文月名 日,年",如:January 12,2004

  ● "英文星期幾 英文月名 日 年 時(shí):分:秒 時(shí)區(qū)",如:Tue May 25 2004 00:00:00 GMT-0700

  例如,要為2004年5月25日創(chuàng)建一個(gè)日期對象,可以使用下面的代碼:

  var someDate = new Date(Date.parse("May 25 , 2004"));
  如果傳入Date.parse()方法的字符串不能表示日期,那么它會返回NaN。實(shí)際上,如果直接將表示日期的字符串傳遞給Date構(gòu)造函數(shù),也會在后臺調(diào)用Date.parse()。換句話說,下面的代碼與前面的例子是等價(jià)的:

  var someDate = new Date('May 25 , 2004');
  Date.UTC()方法同樣也返回表示日期的毫秒數(shù),但它與Date.parse()在構(gòu)建值時(shí)使用不同的信息。Date.UTC()的參數(shù)分別是年份、基于0的月份(一月是0,二月是1,以此類推)。月中的哪一天(1到31)、小時(shí)數(shù)(0到23)、分鐘、秒以及毫秒數(shù)。在這些參數(shù)中,只有前兩個(gè)參數(shù)(年和月)是必需的。如果沒有提供月中的天數(shù),則假設(shè)天數(shù)為1;如果省略其他參數(shù),則統(tǒng)統(tǒng)假設(shè)為0。
復(fù)制代碼 代碼如下:

  //GMT時(shí)間2000年1月1日零時(shí)
  var y2k = new Date(Date.UTC(2000, 0));
  //GMT時(shí)間2005年5月5日下午5:55:55
  var allFives = new Date(Date.UTC(2005,4,5,17,55,55));
  如同模仿Date.parse()一樣,Date構(gòu)造函數(shù)也會模仿Date.UTC(),但有一點(diǎn)明顯不同:日期和時(shí)間都基于本地時(shí)區(qū)而非GMT來創(chuàng)建的??梢詫⑶懊娴睦又貙懭缦拢?

  //本地時(shí)間2000年1月1日零時(shí)
  var y2k = new Date(2000,0);
  //本地時(shí)間2005年5月5日下午5:55:55
  var allFives = new Date(2005,4,5,17,55,55);

  Date類型還有一些專門用于將日期格式化為字符串的方法,這些方法如下:

  ● toDateString()——以特定于實(shí)現(xiàn)的格式顯示星期幾、月、日和年

  ● toTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒和時(shí)區(qū)

  ● toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月、日和年

  ● toLocaleTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒

  ● toUTCString()——以特定于實(shí)現(xiàn)的格式完整的UTC日期

  以上這些字符串格式方法的輸出也是因?yàn)g覽器而異的,因此沒有哪一個(gè)方法能夠用來在用戶界面中顯示一致的日期信息。

  以下是Date類型的所有方法:
方法 描述
Date() 返回當(dāng)日的日期和時(shí)間。
getDate() 從 Date 對象返回一個(gè)月中的某一天 (1 ~ 31)。
getDay() 從 Date 對象返回一周中的某一天 (0 ~ 6)。
getMonth() 從 Date 對象返回月份 (0 ~ 11)。
getFullYear() 從 Date 對象以四位數(shù)字返回年份。
getYear() 請使用 getFullYear() 方法代替。
getHours() 返回 Date 對象的小時(shí) (0 ~ 23)。
getMinutes() 返回 Date 對象的分鐘 (0 ~ 59)。
getSeconds() 返回 Date 對象的秒數(shù) (0 ~ 59)。
getMilliseconds() 返回 Date 對象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒數(shù)。
getTimezoneOffset() 返回本地時(shí)間與格林威治標(biāo)準(zhǔn)時(shí)間 (GMT) 的分鐘差。
getUTCDate() 根據(jù)世界時(shí)從 Date 對象返回月中的一天 (1 ~ 31)。
getUTCDay() 根據(jù)世界時(shí)從 Date 對象返回周中的一天 (0 ~ 6)。
getUTCMonth() 根據(jù)世界時(shí)從 Date 對象返回月份 (0 ~ 11)。
getUTCFullYear() 根據(jù)世界時(shí)從 Date 對象返回四位數(shù)的年份。
getUTCHours() 根據(jù)世界時(shí)返回 Date 對象的小時(shí) (0 ~ 23)。
getUTCMinutes() 根據(jù)世界時(shí)返回 Date 對象的分鐘 (0 ~ 59)。
getUTCSeconds() 根據(jù)世界時(shí)返回 Date 對象的秒鐘 (0 ~ 59)。
getUTCMilliseconds() 根據(jù)世界時(shí)返回 Date 對象的毫秒(0 ~ 999)。
parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒數(shù)。
setDate() 設(shè)置 Date 對象中月的某一天 (1 ~ 31)。
setMonth() 設(shè)置 Date 對象中月份 (0 ~ 11)。
setFullYear() 設(shè)置 Date 對象中的年份(四位數(shù)字)。
setYear() 請使用 setFullYear() 方法代替。
setHours() 設(shè)置 Date 對象中的小時(shí) (0 ~ 23)。
setMinutes() 設(shè)置 Date 對象中的分鐘 (0 ~ 59)。
setSeconds() 設(shè)置 Date 對象中的秒鐘 (0 ~ 59)。
setMilliseconds() 設(shè)置 Date 對象中的毫秒 (0 ~ 999)。
setTime() 以毫秒設(shè)置 Date 對象。
setUTCDate() 根據(jù)世界時(shí)設(shè)置 Date 對象中月份的一天 (1 ~ 31)。
setUTCMonth() 根據(jù)世界時(shí)設(shè)置 Date 對象中的月份 (0 ~ 11)。
setUTCFullYear() 根據(jù)世界時(shí)設(shè)置 Date 對象中的年份(四位數(shù)字)。
setUTCHours() 根據(jù)世界時(shí)設(shè)置 Date 對象中的小時(shí) (0 ~ 23)。
setUTCMinutes() 根據(jù)世界時(shí)設(shè)置 Date 對象中的分鐘 (0 ~ 59)。
setUTCSeconds() 根據(jù)世界時(shí)設(shè)置 Date 對象中的秒鐘 (0 ~ 59)。
setUTCMilliseconds() 根據(jù)世界時(shí)設(shè)置 Date 對象中的毫秒 (0 ~ 999)。
toSource() 返回該對象的源代碼。
toString() 把 Date 對象轉(zhuǎn)換為字符串。
toTimeString() 把 Date 對象的時(shí)間部分轉(zhuǎn)換為字符串。
toDateString() 把 Date 對象的日期部分轉(zhuǎn)換為字符串。
toGMTString() 請使用 toUTCString() 方法代替。
toUTCString() 根據(jù)世界時(shí),把 Date 對象轉(zhuǎn)換為字符串。
toLocaleString() 根據(jù)本地時(shí)間格式,把 Date 對象轉(zhuǎn)換為字符串。
toLocaleTimeString() 根據(jù)本地時(shí)間格式,把 Date 對象的時(shí)間部分轉(zhuǎn)換為字符串。
toLocaleDateString() 根據(jù)本地時(shí)間格式,把 Date 對象的日期部分轉(zhuǎn)換為字符串。
UTC() 根據(jù)世界時(shí)返回 1970 年 1 月 1 日 到指定日期的毫秒數(shù)。
valueOf() 返回 Date 對象的原始值。

Function類型

  JavaScript中什么最有意思,我想那莫過于函數(shù)了——而有意思的根源,則在于函數(shù)實(shí)際上時(shí)對象。每個(gè)函數(shù)都是Function類型的實(shí)例,而且都與其他引用類型一樣具有屬性和方法。由于函數(shù)是對象,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對象的指針,不會與某個(gè)函數(shù)綁定。

  函數(shù)通常是使用函數(shù)聲明語法定義的,如下面例子所示:
復(fù)制代碼 代碼如下:

function sum(num1,num2)
{
return num1 + num2;
}

  這與下面使用函數(shù)表達(dá)式定義函數(shù)的方式幾乎相差無幾:
復(fù)制代碼 代碼如下:

var sun = function(num1,num2){
return num1 + num2;
};

  以上代碼定義了變量sum并將其初始化為一個(gè)函數(shù)。function關(guān)鍵字后面沒有函數(shù)名,這是因?yàn)樵谑褂煤瘮?shù)表達(dá)式定義函數(shù)時(shí),沒有必要使用函數(shù)名——通過變量sum即可引用函數(shù)。另外,還要注意函數(shù)末尾有一個(gè)分號,就像聲明其他變量時(shí)一樣。

  最后一種定義函數(shù)的方式是使用Function構(gòu)造函數(shù)。Function構(gòu)造函數(shù)可以接收任意數(shù)量的參數(shù),但最后一個(gè)參數(shù)始終都被看成是函數(shù)體,而前面的參數(shù)則枚舉出了新函數(shù)的參數(shù)。

  var sum = Function('num1','num2','return num1 + num2'); //不推薦使用此種方式
  由于函數(shù)名僅僅是指向函數(shù)的指針,因此函數(shù)名與包含對象指針的其他變量沒有什么不同。換句話說,一個(gè)函數(shù)可能會有多個(gè)名字,例如:

復(fù)制代碼 代碼如下:

function sum(num1,num2)
{
return num1 + num2;
}
alert(sum(10,10)); //20
var anotherSum = sum;
alert(anotherSum(10,10)); //20
sum = null;
alert(anotherSum(10,10)); //20

  注意:使用不帶括號的函數(shù)名是訪問函數(shù)指針,而非調(diào)用函數(shù)。

  函數(shù)聲明與函數(shù)表達(dá)式
  目前為止,我們一直沒有對函數(shù)聲明和函數(shù)表達(dá)式加以區(qū)別。而實(shí)際上, 解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時(shí),對函數(shù)聲明和函數(shù)表達(dá)式并非一視同仁。解析器會率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問);至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會真正被解釋執(zhí)行。
復(fù)制代碼 代碼如下:

alert(sum(10,10));
function sum(num1,num2)
{
return num1 + num2;
}

  以上代碼完全可以正常運(yùn)行。因?yàn)樵诖a開始執(zhí)行之前,解析器就已經(jīng)讀取函數(shù)聲明并將其添加到執(zhí)行環(huán)境中了。如果像下面例子所示,把上面的函數(shù)聲明改為變量初始化方式,就會在執(zhí)行期間導(dǎo)致錯(cuò)誤。
復(fù)制代碼 代碼如下:

alert(sum(10,10));
var sum = function(num1,num2)
{
return num1 + num2;
}

  作為值的函數(shù)
  因?yàn)镴avaScript中的函數(shù)名本身就是變量,所以函數(shù)也可以作為值來使用。也就是說,不僅可以像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。
復(fù)制代碼 代碼如下:

function callSomeFunction(someFunction , someArgument)
{
return someFunction(someArgument);
}

  這個(gè)函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)應(yīng)該是一個(gè)函數(shù),第二個(gè)參數(shù)應(yīng)該是要傳遞給該函數(shù)的一個(gè)值。然后,就可以像下面的例子一樣傳遞函數(shù)了:

復(fù)制代碼 代碼如下:

function add(num)
{
return num + 10;
}
var result = callSomeFunction(add,10);
alert(result); //20

  當(dāng)然,可以從一個(gè)函數(shù)中返回另一個(gè)函數(shù),而且這也是極為有用的一種技術(shù)。

復(fù)制代碼 代碼如下:

function createSumFunction()
{
return function(num1,num2){
return num1 + num2;
};
}
var sumFunction = createSumFunction();
alert(sumFunction(10,10)); //20

  函數(shù)內(nèi)部屬性
  在函數(shù)內(nèi)部,有兩個(gè)特殊的對象:arguments和this。其中,arguments是一個(gè)類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù),而且可以使用length屬性來確定傳遞進(jìn)來多少個(gè)參數(shù)。

復(fù)制代碼 代碼如下:

function sayHi()
{
alert(arguments.length); //2
alert(arguments[0] + ',' + arguments[1]); //hello,world
}
sayHi('hello','world');

  雖然arguments的主要用途是保存函數(shù)參數(shù),但這個(gè)對象還有一個(gè)名叫callee的屬性,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對象的函數(shù)。看下面這個(gè)非常經(jīng)典的階乘函數(shù):

復(fù)制代碼 代碼如下:

function factorial(num)
{
if(num <= 1){
return 1;
} else {
return num * factorial(num-1);
}
}

  定義階乘函數(shù)一般都要用到遞歸算法;如上面的代碼,在函數(shù)有名字,而且名字以后也不會變的情況下,這樣定義沒有問題。但問題是這個(gè)函數(shù)的執(zhí)行與函數(shù)名factorial緊緊耦合在一起。為了消除這種緊密耦合的現(xiàn)象,可以像下面這樣使用arguments.callee

復(fù)制代碼 代碼如下:

function factorial(num)
{
if(num <= 1){
return 1;
} else {
return num * arguments.callee(num-1);
}
}

  在這個(gè)重寫后的factorial()函數(shù)的函數(shù)體內(nèi),沒有再引用函數(shù)名factorial。這樣,無論引用函數(shù)時(shí)使用是什么名字,都可以保證正常完成遞歸調(diào)用。例如:

復(fù)制代碼 代碼如下:

var trueFactorial = factorial;
factorial = function(){
return 0;
};
alert(trueFactorial(5)); //120
alert(factorial(5)); //0

  函數(shù)內(nèi)部的另一個(gè)特殊對象是this,this引用的是函數(shù)據(jù)以執(zhí)行操作的對象——或者也可以說,this是函數(shù)在執(zhí)行時(shí)所處的作用域(當(dāng)在網(wǎng)頁的全局作用域中調(diào)用函數(shù)時(shí),this對象引用的就是window)??聪旅娴睦樱?

復(fù)制代碼 代碼如下:

window.color = 'red';
var o = {color:'blue'};

function sayColor()
{
alert(this.color);
}

sayColor(); //red
o.sayColor = sayColor;
o.sayColor(); //blue

  上面這個(gè)函數(shù)sayColor()是在全局作用域中定義的,它引用了this對象。由于在調(diào)用函數(shù)之前,this的值并不確定,因此this可能會在代碼執(zhí)行過程中引用不同的對象。當(dāng)在全局作用域中調(diào)用sayColor()時(shí),this引用的是全局對象 window;換句話說,對this.color求值會轉(zhuǎn)換成對window.color求值,于是結(jié)果就是'red'。而當(dāng)把這個(gè)函數(shù)賦給對象o并調(diào)用o.sayColor()時(shí),this引用的是對象o,因此對this.color求值會轉(zhuǎn)換成對o.color求值,結(jié)果就是'blue'。

  函數(shù)屬性和方法
  因?yàn)镴avScript中的函數(shù)是對象,因此函數(shù)也有屬性和方法。每個(gè)函數(shù)都包含兩個(gè)屬性:length和prototype。其中,length屬性表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)。

復(fù)制代碼 代碼如下:

function sayName(name)
{
alert(name);
}
function sayHi()
{
alert('hi');
}

alert(sayName.length);   //1
alert(sayHi.length); //0

  在JavaScript中最耐人尋味的就要數(shù)prototype屬性了。對于引用類型而言,prototype是保存它們所有實(shí)例方法的真正所在。諸如toString()和valueOf()等方法實(shí)際上都是保存在prototype名下,只不過是通過各自對象的實(shí)例訪問罷了。在創(chuàng)建自定義引用類型以及實(shí)現(xiàn)繼承時(shí),prototype屬性的作用是極為重要的(這里就不對prototype屬性做詳細(xì)介紹了)。

  每個(gè)函數(shù)都包含兩個(gè)非繼承而來的方法:apply()和call()。這兩個(gè)方法的用途是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對象的值。首先,apply()方法接受兩個(gè)參數(shù):一個(gè)是在其中運(yùn)行函數(shù)的作用域,另一個(gè)是參數(shù)數(shù)組。其中,第二個(gè)參數(shù)可以是Array的實(shí)例,也可以是arguments對象。例如:

復(fù)制代碼 代碼如下:

function sum(num1,num2)
{
return num1 + num2;
}
function callSum1(num1,num2)
{
return sum.apply(this,arguments);
}
function callSum2(num1,num2)
{
return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20

  在上面例子中,callSum1()在執(zhí)行sum()函數(shù)時(shí)傳入了this作為作用域(因?yàn)槭窃谌肿饔糜蛑姓{(diào)用的,所以傳入的就是window對象)和arguments對象。而callSum2同樣也調(diào)用了sum()函數(shù),但它傳入的則是this和一個(gè)參數(shù)數(shù)組。

  call()方法與apply()方法的作用相同,它們的區(qū)別僅在于接收參數(shù)的方式不同。對于call()方法而言,第一個(gè)參數(shù)是作用域沒有變化,變化的只是其余的參數(shù)都是直接傳遞給函數(shù)的。
復(fù)制代碼 代碼如下:

function callSum2(num1,num2)
{
return sum.call(this,num1,num2);
}
alert(callSum2(10,10)); //20

  事實(shí)上,傳遞參數(shù)并非apply()和call()真正的用武之地;它們真正強(qiáng)大的地方是能夠擴(kuò)充函數(shù)賴以運(yùn)行的作用域??聪旅娴睦樱?

復(fù)制代碼 代碼如下:

window.color = 'red';
var o = {color:'blue'};

function sayColor()
{
alert(this.color);
}

sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue

  在上面的例子中,當(dāng)運(yùn)行sayColor.call(o)時(shí),函數(shù)的執(zhí)行環(huán)境就不一樣了,因?yàn)榇藭r(shí)函數(shù)體內(nèi)的this對象指向了o,于是結(jié)果顯示"blue"。

  注意:每個(gè)函數(shù)都有一個(gè)非標(biāo)準(zhǔn)的caller屬性,該屬性指向調(diào)用當(dāng)前函數(shù)的函數(shù)。一般是在一個(gè)函數(shù)的內(nèi)部,通過arguments.callee.caller來實(shí)現(xiàn)對調(diào)用棧的追溯。目前,IE、FireFox、Chrome都支持該屬性,但建議將該屬性用于調(diào)試目的。

內(nèi)置對象
  JavaScript中有兩個(gè)內(nèi)置對象:Global和Math。

 Global對象
  Global(全局)對象可以說是JavaScript中最特別的一個(gè)對象了,因?yàn)椴还苣銖氖裁唇嵌壬峡?,這個(gè)對象都是不存在的。JavaScript中的Global對象在某種意義上是作為一個(gè)終極的“兜底兒對象”來定義的。換句話說,不屬于任何其他對象的屬性和方法,最終都是它的屬性和方法。事實(shí)上,沒有全局變量或全局函數(shù);所有在全局作用域定義的屬性和函數(shù),都是Global對象的屬性。諸如isNaN()、parseInt()以及parseFloat(),實(shí)際上全都是Global對象的方法,Global對象還包含其他一些方法。

  URI編碼方法
  Global對象的encodeURI()和encodeURIComponent()方法可以對URI進(jìn)行編碼,以便發(fā)送給瀏覽器。有效的URI中不能包含某些字符,例如空格。而這兩個(gè)URI編碼方法就可以對URI進(jìn)行編碼,它們用特殊的UTF-8編碼替換所有無效的字符,從而讓瀏覽器能夠接受和理解。

  其中,encodeURI()主要用于整個(gè)URI(例如:http://www.test.com/test value.html),而encodeURIComponent()主要用于對URI中的某一段(例如前面URI中的test value.html)進(jìn)行編碼。它們主要區(qū)別在于,encodeURI()不會對本身屬于URI的特殊字符進(jìn)行編碼,例如冒號、正斜杠、問好和井號;而encodeURIComponent()則會對它發(fā)現(xiàn)的任何非標(biāo)準(zhǔn)字符進(jìn)行編碼。

復(fù)制代碼 代碼如下:

var uri = "http://www.test.com/test value.html#start";
//"http://www.test.com/test%20value.html#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.test.com%2Ftest%20value.html%23start"
alert(encodeURIComponent(uri));

  一般來說,使用encodeURIComponent()方法的時(shí)候要比使用encodeURI()更多,因?yàn)樵趯?shí)踐中更常見的是對查詢字符串參數(shù)而不是對基礎(chǔ)URI進(jìn)行編碼。

  與encodeURI()和encodeURIComponent()方法對應(yīng)的兩個(gè)方法分別是decodeURI()和decodeURIComponent()。其中,decodeURI()只能對encodeURI()替換的字符進(jìn)行解碼,同樣,decodeURIComponent()只能對encodeURIComponent()替換的字符進(jìn)行解碼。

  eval()方法
  eval()方法大概是JavaScript中最強(qiáng)大的一個(gè)方法了,eval()方法就像是一個(gè)完整的JavaScript解析器,它只接受一個(gè)參數(shù),即要執(zhí)行的字符串??聪旅娴睦樱?

  eval("alert('hi')");
  這行代碼的作用等價(jià)于下面這行代碼:

  alert('hi');
  當(dāng)解析器發(fā)現(xiàn)代碼中調(diào)用eval()方法時(shí),它會將傳入的參數(shù)當(dāng)做實(shí)際的JavaScript語句來解析,然后把執(zhí)行結(jié)果插入到原位置。通過eval()執(zhí)行的代碼被認(rèn)為是包含該次調(diào)用的執(zhí)行環(huán)境的一部分,因此被執(zhí)行的代碼具有與該執(zhí)行環(huán)境相同的作用域鏈。這意味著通過eval()執(zhí)行的代碼可以引用在包含環(huán)境中定義的變量,例如:

var msg = 'hello world';
eval('alert(msg)'); //hello world
  可見,變量msg是在eval()調(diào)用的環(huán)境之外定義的,但其中調(diào)用的alert()仍然能夠顯示“hello world”。這是因?yàn)樯厦娴诙写a最終被替換成了一行真正的代碼。同樣地,我們也可以在eval()調(diào)用中定義一個(gè)函數(shù),然后再在該調(diào)用的外部代碼中引用這個(gè)函數(shù):

eval("function sayHi(){alert('hi')}");
sayHi();
  注意:能夠解釋代碼字符串的能力非常強(qiáng)大,但也非常危險(xiǎn)。因此在使用eval()時(shí)必須極為謹(jǐn)慎,特別是在用它執(zhí)行用戶輸入數(shù)據(jù)的情況下。否則,可能會有惡意用戶輸入威脅你的站點(diǎn)或應(yīng)用程序安全的代碼(即所謂的代碼注入)。

 Math對象
  與我們在JavaScript直接編寫的計(jì)算功能相比,Math對象提供的計(jì)算功能執(zhí)行起來要快得多。Math對象還提供了輔助完成這些計(jì)算的屬性。

屬性 描述
E 返回算術(shù)常量 e,即自然對數(shù)的底數(shù)(約等于2.718)。
LN2 返回 2 的自然對數(shù)(約等于0.693)。
LN10 返回 10 的自然對數(shù)(約等于2.302)。
LOG2E 返回以 2 為底的 e 的對數(shù)(約等于 1.414)。
LOG10E 返回以 10 為底的 e 的對數(shù)(約等于0.434)。
PI 返回圓周率(約等于3.14159)。
SQRT1_2 返回返回 2 的平方根的倒數(shù)(約等于 0.707)。
SQRT2 返回 2 的平方根(約等于 1.414)。

Math對象包含的方法如下:

方法 描述
abs(x) 返回?cái)?shù)的絕對值。
acos(x) 返回?cái)?shù)的反余弦值。
asin(x) 返回?cái)?shù)的反正弦值。
atan(x) 以介于 -PI/2 與 PI/2 弧度之間的數(shù)值來返回 x 的反正切值。
atan2(y,x) 返回從 x 軸到點(diǎn) (x,y) 的角度(介于 -PI/2 與 PI/2 弧度之間)。
ceil(x) 對數(shù)進(jìn)行上舍入。
cos(x) 返回?cái)?shù)的余弦。
exp(x) 返回 e 的指數(shù)。
floor(x) 對數(shù)進(jìn)行下舍入。
log(x) 返回?cái)?shù)的自然對數(shù)(底為e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次冪。
random() 返回 0 ~ 1 之間的隨機(jī)數(shù)。
round(x) 把數(shù)四舍五入為最接近的整數(shù)。
sin(x) 返回?cái)?shù)的正弦。
sqrt(x) 返回?cái)?shù)的平方根。
tan(x) 返回角的正切。
toSource() 返回該對象的源代碼。
valueOf() 返回 Math 對象的原始值。

相關(guān)文章

最新評論