多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > htmlcss > JavaScript:引用類型

JavaScript:引用類型

來源:程序員人生   發布時間:2016-06-03 19:00:31 閱讀次數:2856次

  援用類型的值(對象)是援用類型的1個實例。在ECMAscript中,援用類型是1種數據結構,用于將數據和功能組織在1起。它也常被稱為類,但是這類稱呼其實不妥當。雖然ECMAscript從技術講是1門面向對象的語言,但是它不具有傳統的面向對象語言所支持的類和接口等基本結構。援用類型有時候也稱為對象定義,由于它們描寫的是1類對象所具有的屬性和方法。

1、Object類型

  Object類型是JavaScript中使用最多的1種類型。雖然Object的實例不具有多少功能,但對在利用程序中存儲和傳輸數據而言,它確切是非常理想的選擇。

  創建Object實例的方式有兩種,第1種是使用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;

  雖然可使用前面介紹的任何1種方法來定義對象,但開發人員更青睞第2種方法(對象字面量語法),由于這類語法要求的代碼量少,而且能給人封裝數據的感覺。實際上,對象字面量也是向函數傳遞大量可選參數的首選方式,例如:

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

  1般來講,訪問對象屬性時使用的都是點表示法,這也是很多面向對象語言中通用的語法。不過,在JavaScript也能夠使用方括號表示法來訪問對象的屬性。例如:

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

  從功能上看,這兩種訪問對象屬性的方法沒有任何區分。但方括號語法的主要優點是可以通過變量來訪問屬性。

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

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

2、Array類型

  除object以外,Array類型恐怕是ECMAscript中最經常使用的類型了,ECMAscript中的數組與其他多數語言中的數組有著相當大的區分。雖然JavaScript數組與其他語言中的數組都是數據的有序列表,但與其他語言不同的是,JavaScript數組的每項可以保持任何類型的數據。也就是說,可以用數組的第1個位置來保存字符串,用第2個位置來保存數值,用第3個位置來保存對象。而且,JavaScript數組的大小是可以動態調劑的,便可以隨著數據的添加自動增長以容納新增數據。

  創建數組的基本方式有兩種。第1種是使用Array構造函數。

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

   在使用Array構造函數時可以省略new操作符,例如:

var colors = Array(10); var colorName = Array('red');

  創建數組的第2種基本方式是使用數組字面量表示法。

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

  在讀取和設置數組的值時,要使用方括號并提供相應值的基于0的數字索引。

var colors = ['red','blue','yellow']; //定義1個字符串數組 alert(colors[0]); //顯示第1項 colors[2] = 'green'; //修改第3項 colors[3] = 'black'; //新增第4項

  數組的長度保存在其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

  這個例子中的數組colors1開始有3個值。將其length屬性設置為2會移除最后1項,結果再訪問colors[2]就會顯示undefined了。

  利用length屬性也能夠方便地在數組末尾添加新項。

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

  由于數組最后1項的索引始終是length⑴,因此下1個新項的位置就是length。

(1)、檢測數組

     ECMAscript5新增了Array.isArray()方法,這個方法的目的是終究肯定某個值究竟是不是數組,而不管它是在哪一個全局履行環境中創建。這個方法的用法以下:

     if(Array.isArray(value)){

        //對數組履行某些操作;

     }

(2)、轉換方法

  所有對象都具有toLocaleString()、toString()和valueOf()方法。其中,調用數組的toString()和valueOf()方法會返回相同的值,即由數組中每一個值的字符串構成拼接而成的1個以逗號分隔的字符串。實際上,為了創建這個字符串會調用數組每項的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()方法,以便返回數組的字符串表示,每一個值的字符串表示拼接成了1個字符串,中間以逗號分隔。最后1行代碼直接將數組傳遞給了alert()。由于alert()要接收字符串參數,所有它會在后臺調用toString()方法,由此會得到與直接調用toString()方法相同的結果。

  另外,toLocaleString()方法常常也會返回與toString()和valueOf()方法相同的值,但也不總是如此。當調用數組的toLocaleString()方法時,它也會創建1個數組值的以逗號分隔的字符串。而與前兩個方法唯1的不同的地方在于,這1次為了獲得每項的值,調用的是每項的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

  注意:如果數組中的某1項的值是null或undefined,那末該值在join()、toString()、toLocaleString()和valueOf()方法返回的結果中以空字符串表示。

(3)、棧方法

  JavScript數組也提供了1種讓數組的行動類似于其他數據結構的方法。具體來講,數組可以表現得就像棧1樣,后者是1種可以限制插入和刪除項的數據結構。棧是1種落后先出的數據結構。而棧中項的插入(叫做推入)和移除(叫做彈出),只產生在1個位置——棧的頂部。JavaScript提供了push()和pop()方法,以便實現類似的棧行動。

  push()方法可以接收任意數量的參數,把它們逐一添加到數組末尾,并返回修改后數組的長度。而pop()方法則從數組末尾移除最后1項,減少數組的length值,然后返回移除的項。  

var colors = new Array(); //創建1個數組 var count = colors.push('red','blue'); //推入兩項 alert(count); //2 count = colors.push('yellow'); //再推入1項 alert(count); //3 var item = colors.pop(); //獲得最后1項 alert(item); //yellow alert(colors.length); //2

(4)、隊列方法

  隊列數據結構的訪問規則是先進先出。隊列在列表的末端添加項,從列表的前端移除項。由于push()是向數組末端添加項的方法,因此要摹擬隊列只需1個從數組前端獲得項的方法。實現這1操作的數組方法就是shift(),它能夠移除數組中的第1個項并返回該項,同時將數組長度減1。結合使用shift()和push()方法,可以像使用隊列1樣使用數組:   

var colors = new Array(); //創建1個數組 var count = colors.push('red','blue'); //推入兩項 alert(count); //2 count = colors.push('yellow'); //再推入1項 alert(count); //3 var item = colors.shift(); //獲得第1項 alert(item); //red alert(colors.length); //2

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

var colors = new Array(); //創建1個數組 var count = colors.unshift('red','blue'); //推入兩項 alert(count); //2 count = colors.unshift('yellow'); //再推入1項 alert(count); //3 var item = colors.pop(); //獲得第1項 alert(item); //blue alert(colors.length); //2

  注意:IE對JavaScript的實現中存在1個偏差,其unshift()方法總是返回undefined而不是數組的新長度。

(5)、重排序方法

  數組中已存在兩個可以直接用來重排序的方法: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()方法可以接收1個比較函數作為參數,以便我們指定哪一個值位于哪一個值的前面。  

function compare(value1,value2){ if(value1 < value2){ return 1; } else if(value1 > value2){ return ⑴; } else{ return 0; } } var values = [0,1,5,10,15]; values.sort(compare); alert(values); //15,10,5,1,0

  對數值類型或其valueOf()方法會返回數值類型的對象類型,可使用1個更簡單的比較函數。這個函數主要用第2個值減第1個值便可。

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

(6)、操作方法

  JavaScript對操作數組提供了很多方法。其中,concat()方法可以基于當前數組中的所有項創建1個新數組,如果傳遞給concat()方法的是1或多個數組,則該方法會將這些數組中的每項都添加到結果數組中。如果傳遞的值不是數組,這些值就會被簡單地添加到結果數組的末尾。

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()方法能夠基于當前數組中的1或多個項創建1個新數組。slice()方法可以接受1或兩個參數,即要返回項的起始和結束位置。在只有1個參數的情況下,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個參數:要刪除的第1項的位置和要刪除的項數。例如,splice(0,2)會刪除數組中的前兩項。

  插入——可以向指定位置插入任意數量的項,只需提供3個參數:起始位置、0(要刪除的項數)、要插入的項。如果要插入多個項,可以再傳入第4、第5,以致任意多個項。例如,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); //刪除第1項 alert(colors); //green,blue alert(removed); //red removed = colors.splice(1,0,'yellow','black'); //從位置1開始插入兩項 alert(colors); //green,yellow,black,blue alert(removed); //返回1個空數組 removed = colors.splice(1,1,'red','brown'); //插入兩項,刪除1項 alert(colors); //green,red,brown,black,blue alert(removed); //yellow

(7)、位置方法

  ECMAscript5為數組實例添加了兩個位置方法:indexOf()和lastIndexOf()。這兩個方法都接收兩個參數:要查找的項和(可選的)表示查找出發點位置的索引。其中indexOf()方法從數組的開頭開始向后查找,lastIndexOf()方法從數組的末尾開始向前查找。 

var numbers=[1,2,3,4,5,4,3,2,1]; alert(numbers.indexOf(4));//3 alert(numbers.lastIndexOf(4));//5 alert(numbers.indexOf(4,4));//5 alert(numbers.lastIndexOf(4,4));//3

(8)、迭代方法

  ECMAscript5為數組定義了5個迭代方法。每一個方法都接收兩個參數:要在每項上運行的函數和(可選的)運行該函數的作用域對象—影響this的值。傳入這些方法中的函數會接收3個參數:數組項的值、該項在數組中的位置和數組對象本身。

     every():對數組中的每項運行給定函數,如果該函數對每項都返回true,

            則返回true。

    filter():對數組中的每項運行給定函數,返回該函數會返回true的項組

            成的數組。

   forEach():對數組中的每項運行給定函數,這個方法沒有返回值。

      map():對數組中的每項運行給定函數,返回每次調用函數的結果組成

         的數組。

     some():對數組中的每項運行給定函數,如果該函數對任1項返回true,

         則返回true。  

var numbers=[1,2,3,4,5,4,3,2,1]; var everyResult=numbers.every(function(item,index,array){ return(item>2); }) alert(everyResult); //false var someResult=numbers.some(function(item,index,array){ return(item>2); }) alert(someResult); //ture var filterResult=numbers.filter(function(item,index,array){ return(item>2); }) alert(filterResult); //[3,4,5,4,3] var mapResult=numbers.map(function(item,index,array){ return item*2; }) alert(mapResult); //[2,4,6,8,10,8,6,4,2] var forEachResult=numbers. forEach(function(item,index,array){ //履行某些操作; })

(9)、歸并方法

  ECMAscript5還新增了兩個歸并數組的方法:reduce()和reduceRight()。這兩個方法都會迭代數組的所有項,然后構建1個終究返回的值。其中,reduce()方法從數組的第1項開始,逐一遍歷到最后。而reduceRight()則從數組的最后1項開始,向前遍歷到第1項。

 

3、Date類型

  JavaScript中的Date類型是在初期Java中的java.util.Date類基礎上構建的。為此,Date類型使用自UTC 1970年1月1日零時開始經過的毫秒數來保存日期。在使用這類數據存儲格式的條件下,Date類型保存的日期能夠精確到1970年1月1日之前或以后的100000000年。

  要創建1個日期對象,使用new操作符和Date構造函數便可。

             var now = new Date();

  在調用Date構造函數而不傳遞參數的情況下,新創建的對象自動取得當前日期和時間。如果想根據特定的日期和時間創建日期對象,必須傳入表示該日期的毫秒數。為了簡化這1計算進程,JavaScript提供了兩個方法:Date.parse()和Date.UTC()。

  其中,Date.parse()方法接收1個表示日期的字符串參數,然后嘗試根據這個字符串返回相應日期的毫秒數。JavaScript沒有定義Date.parse()應當支持哪一種格式,因此這個方法的行動因實現而異,而且通常是因地區而異。將地區設置為美國的閱讀器通常都接受以下日期格式:

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

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

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

  例如,要為2004年5月25日創建1個日期對象,可使用下面的代碼:

  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的月份(1月是0,2月是1,以此類推)。月中的哪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()1樣,Date構造函數也會模仿Date.UTC(),但有1點明顯不同:日期和時間都基于本地時區而非GMT來創建的??梢詫⑶懊娴睦又貙懸韵拢?/span>

  //本地時間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類型還有1些專門用于將日期格式化為字符串的方法,這些方法以下:

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

  ● toTimeString()——以特定于實現的格式顯示時、分、秒和時區

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

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

  ● toUTCString()——以特定于實現的格式完全的UTC日期

  以上這些字符串格式方法的輸出也是因閱讀器而異的,因此沒有哪個方法能夠用來在用戶界面中顯示1致的日期信息。

以下是Date類型的所有方法:

Date() 返回當日的日期和時間。

getDate() 從 Date 對象返回1個月中的某1天 (1 ~ 31)。

getDay() 從 Date 對象返回1周中的某1天 (0 ~ 6)。

getMonth() 從 Date 對象返回月份 (0 ~ 11)。

getFullYear() 從 Date 對象以4位數字返回年份。

getYear() 請使用 getFullYear() 方法代替。

getHours() 返回 Date 對象的小時 (0 ~ 23)。

getMinutes() 返回 Date 對象的分鐘 (0 ~ 59)。

getSeconds() 返回 Date 對象的秒數 (0 ~ 59)。

getMilliseconds() 返回 Date 對象的毫秒(0 ~ 999)。

getTime() 返回 1970 年 1 月 1 日至今的毫秒數。

getTimezoneOffset() 返回本地時間與格林威治標準時間 (GMT) 的分鐘差。

getUTCDate() 根據世界時從 Date 對象返回月中的1天 (1 ~ 31)。

getUTCDay() 根據世界時從 Date 對象返回周中的1天 (0 ~ 6)。

getUTCMonth() 根據世界時從 Date 對象返回月份 (0 ~ 11)。

getUTCFullYear() 根據世界時從 Date 對象返回4位數的年份。

getUTCHours() 根據世界時返回 Date 對象的小時 (0 ~ 23)。

getUTCMinutes() 根據世界時返回 Date 對象的分鐘 (0 ~ 59)。

getUTCSeconds() 根據世界時返回 Date 對象的秒鐘 (0 ~ 59)。

getUTCMilliseconds() 根據世界時返回 Date 對象的毫秒(0 ~ 999)。

parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒數。

setDate() 設置 Date 對象中月的某1天 (1 ~ 31)。

setMonth() 設置 Date 對象中月份 (0 ~ 11)。

setFullYear() 設置 Date 對象中的年份(4位數字)。

setYear() 請使用 setFullYear() 方法代替。

setHours() 設置 Date 對象中的小時 (0 ~ 23)。

setMinutes() 設置 Date 對象中的分鐘 (0 ~ 59)。

setSeconds() 設置 Date 對象中的秒鐘 (0 ~ 59)。

setMilliseconds() 設置 Date 對象中的毫秒 (0 ~ 999)。

setTime() 以毫秒設置 Date 對象。

setUTCDate() 根據世界時設置 Date 對象中月份的1天 (1 ~ 31)。

setUTCMonth() 根據世界時設置 Date 對象中的月份 (0 ~ 11)。

setUTCFullYear() 根據世界時設置 Date 對象中的年份(4位數字)。

setUTCHours() 根據世界時設置 Date 對象中的小時 (0 ~ 23)。

setUTCMinutes() 根據世界時設置 Date 對象中的分鐘 (0 ~ 59)。

setUTCSeconds() 根據世界時設置 Date 對象中的秒鐘 (0 ~ 59)。

setUTCMilliseconds() 根據世界時設置 Date 對象中的毫秒 (0 ~ 999)。

toSource() 返回該對象的源代碼。

toString() 把 Date 對象轉換為字符串。

toTimeString() 把 Date 對象的時間部份轉換為字符串。

toDateString() 把 Date 對象的日期部份轉換為字符串。

toGMTString() 請使用 toUTCString() 方法代替。

toUTCString() 根據世界時,把 Date 對象轉換為字符串。

toLocaleString() 根據本地時間格式,把 Date 對象轉換為字符串。

toLocaleTimeString() 根據本地時間格式,把 Date 對象的時間部份轉換為字符串。

toLocaleDateString() 根據本地時間格式,把 Date 對象的日期部份轉換為字符串。

UTC() 根據世界時返回 1970 年 1 月 1 日 到指定日期的毫秒數。

valueOf() 返回 Date 對象的原始值。

 

4、Function類型

  JavaScript中甚么最成心思,我想那莫過于函數了——而成心思的本源,則在于函數實際上時對象。每一個函數都是Function類型的實例,而且都與其他援用類型1樣具有屬性和方法。由于函數是對象,因此函數名實際上也是1個指向函數對象的指針,不會與某個函數綁定。

  函數通常是使用函數聲明語法定義的,以下面例子所示:

    

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

  這與下面使用函數表達式定義函數的方式幾近相差無幾:

   

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

  以上代碼定義了變量sum并將其初始化為1個函數。function關鍵字后面沒有函數名,這是由于在使用函數表達式定義函數時,沒有必要使用函數名——通過變量sum便可援用函數。另外,還要注意函數末尾有1個分號,就像聲明其他變量時1樣。

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

 var sum = Function('num1','num2','return num1 + num2'); //不推薦使用此種方式

  由于函數名僅僅是指向函數的指針,因此函數名與包括對象指針的其他變量沒有甚么不同。換句話說,1個函數可能會有多個名字,例如:  

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

  注意:使用不帶括號的函數名是訪問函數指針,而非調用函數。

(1)、函數聲明與函數表達式

  目前為止,我們1直沒有對函數聲明和函數表達式加以區分。而實際上, 解析器在向履行環境中加載數據時,對函數聲明和函數表達式并不是1視同仁。解析器會率先讀取函數聲明,并使其在履行任何代碼之前可用(可以訪問);至于函數表達式,則必須等到解析器履行到它所在的代碼行,才會真正被解釋履行。  

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

  以上代碼完全可以正常運行。由于在代碼開始履行之前,解析器就已讀取函數聲明并將其添加到履行環境中了。如果像下面例子所示,把上面的函數聲明改成變量初始化方式,就會在履行期間致使毛病。    

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

 (2)、作為值的函數

  由于JavaScript中的函數名本身就是變量,所以函數也能夠作為值來使用。也就是說,不但可以像傳遞參數1樣把1個函數傳遞給另外一個函數,而且可以將1個函數作為另外一個函數的結果返回。   

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

  這個函數接受兩個參數,第1個參數應當是1個函數,第2個參數應當是要傳遞給該函數的1個值。然后,就能夠像下面的例子1樣傳遞函數了:    

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

  固然,可以從1個函數中返回另外一個函數,而且這也是極其有用的1種技術。  

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

(3)、函數內部屬性

  在函數內部,有兩個特殊的對象:arguments和this。其中,arguments是1個類數組對象,包括著傳入函數中的所有參數,而且可使用length屬性來肯定傳遞進來多少個參數。   

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

  雖然arguments的主要用處是保存函數參數,但這個對象還有1個名叫callee的屬性,該屬性是1個指針,指向具有這個arguments對象的函數??聪旅孢@個非常經典的階乘函數:    

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

  定義階乘函數1般都要用到遞歸算法;如上面的代碼,在函數著名字,而且名字以后也不會變的情況下,這樣定義沒有問題。但問題是這個函數的履行與函數名factorial牢牢耦合在1起。為了消除這類緊密耦合的現象,可以像下面這樣使用arguments.callee   

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

  在這個重寫后的factorial()函數的函數體內,沒有再援用函數名factorial。這樣,不管援用函數時使用是甚么名字,都可以保證正常完成遞歸調用。例如:   

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

  函數內部的另外一個特殊對象是this,this援用的是函數據以履行操作的對象——或也能夠說,this是函數在履行時所處的作用域(當在網頁的全局作用域中調用函數時,this對象援用的就是window)??聪旅娴睦樱?/span>  

window.color = 'red'; var o = {color:'blue'}; function sayColor() { alert(this.color); } sayColor(); //red o.sayColor = sayColor; o.sayColor(); //blue

  上面這個函數sayColor()是在全局作用域中定義的,它援用了this對象。由于在調用函數之前,this的值其實不肯定,因此this可能會在代碼履行進程中援用不同的對象。當在全局作用域中調用sayColor()時,this援用的是全局對象 window;換句話說,對this.color求值會轉換成對window.color求值,因而結果就是'red'。而當把這個函數賦給對象o并調用o.sayColor()時,this援用的是對象o,因此對this.color求值會轉換成對o.color求值,結果就是'blue'。

(4)、函數屬性和方法

  由于JavScript中的函數是對象,因此函數也有屬性和方法。每一個函數都包括兩個屬性:length和prototype。其中,length屬性表示函數希望接收的命名參數的個數   

function sayName(name) { alert(name); } function sayHi() { alert('hi'); } alert(sayName.length); //1 alert(sayHi.length); //0

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

  每一個函數都包括兩個非繼承而來的方法:apply()和call()。這兩個方法的用處是在特定的作用域中調用函數,實際上等于設置函數體內this對象的值。首先,apply()方法接受兩個參數:1個是在其中運行函數的作用域,另外一個是參數數組。其中,第2個參數可以是Array的實例,也能夠是arguments對象。例如:   

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()在履行sum()函數時傳入了this作為作用域(由于是在全局作用域中調用的,所以傳入的就是window對象)和arguments對象。而callSum2一樣也調用了sum()函數,但它傳入的則是this和1個參數數組。

  call()方法與apply()方法的作用相同,它們的區分僅在于接收參數的方式不同。對call()方法而言,第1個參數是作用域沒有變化,變化的只是其余的參數都是直接傳遞給函數的。   

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

  事實上,傳遞參數并不是apply()和call()真實的用武之地;它們真正強大的地方是能夠擴充函數賴以運行的作用域??聪旅娴睦樱?/span>

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

  在上面的例子中,當運行sayColor.call(o)時,函數的履行環境就不1樣了,由于此時函數體內的this對象指向了o,因而結果顯示"blue"。

  注意:每一個函數都有1個非標準的caller屬性,該屬性指向調用當前函數的函數。1般是在1個函數的內部,通過arguments.callee.caller來實現對調用棧的追溯。目前,IE、FireFox、Chrome都支持該屬性,但建議將該屬性用于調試目的。

4、內置對象

 JavaScript中有兩個內置對象:Global和Math。

(1)、Global對象

  Global(全局)對象可以說是ECMAscript中最特別的1個對象了,由于不管你從甚么角度上看,這個對象都是不存在的。JavaScript中的Global對象在某種意義上是作為1個終極的“兜底兒對象”來定義的。換句話說,不屬于任何其他對象的屬性和方法,終究都是它的屬性和方法。事實上,沒有全局變量或全局函數;所有在全局作用域定義的屬性和函數,都是Global對象的屬性。諸如isNaN()、parseInt()和parseFloat(),實際上全都是Global對象的方法,Global對象還包括其他1些方法。

    1)、URI編碼方法

  Global對象的encodeURI()和encodeURIComponent()方法可以對URI進行編碼,以便發送給閱讀器。有效的URI中不能包括某些字符,例如空格。而這兩個URI編碼方法就能夠對URI進行編碼,它們用特殊的UTF⑻編碼替換所有沒有效的字符,從而讓閱讀器能夠接受和理解。

  其中,encodeURI()主要用于全部URI(例如:http://www.test.com/test value.html),而encodeURIComponent()主要用于對URI中的某1段(例如前面URI中的test value.html)進行編碼。它們主要區分在于,encodeURI()不會對本身屬于URI的特殊字符進行編碼,例如冒號、正斜杠、問好和井號;而encodeURIComponent()則會對它發現的任何非標準字符進行編碼。

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

  1般來講,使用encodeURIComponent()方法的時候要比使用encodeURI()更多,由于在實踐中更常見的是對查詢字符串參數而不是對基礎URI進行編碼。

  與encodeURI()和encodeURIComponent()方法對應的兩個方法分別是decodeURI()和decodeURIComponent()。其中,decodeURI()只能對encodeURI()替換的字符進行解碼,一樣,decodeURIComponent()只能對encodeURIComponent()替換的字符進行解碼。

    2)、eval()方法

  eval()方法大概是JavaScript中最強大的1個方法了,eval()方法就像是1個完全的JavaScript解析器,它只接受1個參數,即要履行的字符串。看下面的例子:

  eval("alert('hi')");

  這行代碼的作用等價于下面這行代碼:

  alert('hi');

  當解析器發現代碼中調用eval()方法時,它會將傳入的參數當作實際的JavaScript語句來解析,然后把履行結果插入到原位置。通過eval()履行的代碼被認為是包括該次調用的履行環境的1部份,因此被履行的代碼具有與該履行環境相同的作用域鏈。這意味著通過eval()履行的代碼可以援用在包括環境中定義的變量,例如:

var msg = 'hello world'; eval('alert(msg)'); //hello world

  可見,變量msg是在eval()調用的環境以外定義的,但其中調用的alert()依然能夠顯示“hello world”。這是由于上面第2行代碼終究被替換成了1行真實的代碼。一樣地,我們也能夠在eval()調用中定義1個函數,然后再在該調用的外部代碼中援用這個函數:

eval("function sayHi(){alert('hi')}"); sayHi();

  注意:能夠解釋代碼字符串的能力非常強大,但也非常危險。因此在使用eval()時必須極其謹慎,特別是在用它履行用戶輸入數據的情況下。否則,可能會有歹意用戶輸入要挾你的站點或利用程序安全的代碼(即所謂的代碼注入)。

(2)、Math對象

  與我們在JavaScript直接編寫的計算功能相比,Math對象提供的計算功能履行起來要快很多。Math對象還提供了輔助完成這些計算的屬性。

E 返回算術常量 e,即自然對數的底數(約等于2.718)。

LN2 返回 2 的自然對數(約等于0.693)。

LN10 返回 10 的自然對數(約等于2.302)。

LOG2E 返回以 2 為底的 e 的對數(約等于 1.414)。

LOG10E 返回以 10 為底的 e 的對數(約等于0.434)。

PI 返回圓周率(約等于3.14159)。

SQRT1_2 返回返回 2 的平方根的倒數(約等于 0.707)。

SQRT2 返回 2 的平方根(約等于 1.414)。

Math對象包括的方法以下:

abs(x) 返回數的絕對值。

acos(x) 返回數的反余弦值。

asin(x) 返回數的反正弦值。

atan(x) 以介于 -PI/2 與 PI/2 弧度之間的數值來返回 x 的反正切值。

atan2(y,x) 返回從 x 軸到點 (x,y) 的角度(介于 -PI/2 與 PI/2 弧度之間)。

ceil(x) 對數進行上舍入。

cos(x) 返回數的余弦。

exp(x) 返回 e 的指數。

floor(x) 對數進行下舍入。

log(x) 返回數的自然對數(底為e)。

max(x,y) 返回 x 和 y 中的最高值。

min(x,y) 返回 x 和 y 中的最低值。

pow(x,y) 返回 x 的 y 次冪。

random() 返回 0 ~ 1 之間的隨機數。

round(x) 把數4舍5入為最接近的整數。

sin(x) 返回數的正弦。

sqrt(x) 返回數的平方根。

tan(x) 返回角的正切。

toSource() 返回該對象的源代碼。

valueOf() 返回 Math 對象的原始值。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------

上一篇 VRP系統——5

下一篇 Hadoop get JobId

分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本www黄| 看大片免费网站 | 亚洲欧美日韩在线观看播放 | 欧美一区二区三区精品国产 | 久久国产经典视频 | xxxx18野外xxxxfreexxxx日本 | 一级精品视频 | 亚洲综合久久1区2区3区 | 天堂在线天堂最新版 | 在线亚洲天堂 | 91福利国产在线观看 | 免费看黄网站大全 | 一区二区三区日韩 | 欧美一级日韩一级 | 精品欧美一区二区三区 | 伊人99| 欧美日韩在线永久免费播放 | 波多野结衣与公中出中文字幕 | 国产成人一区二区三区 | 久久精品视| 最近中文字幕完整在线看一 | 中国美女牲交一级毛片 | 国产精品第4页 | 欧美free三人性高清 | 中文字幕一区二区三区 精品 | 亚洲国产成人久久综合一区77 | 亚洲欧美日韩在线观看看另类 | 欧美国产精品不卡在线观看 | 91精品久久久久久久久网影视 | 精品国产一区二区三区香蕉沈先生 | 国产欧美日韩亚洲 | 伊人久久国产 | 免费看毛片网站 | 无码中文av有码中文av | 亚洲人成图片欧美人成图片 | a网站在线观看免费网站 | 亚洲精品一区二区三区四区 | 国产精品亚洲综合一区 | 女人一级毛片免费观看 | 真实国产精品视频国产网 | 欧美精品高清在线观看 |