摘要:對(duì)象是某個(gè)特定引用類型的實(shí)例,新對(duì)象是使用操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建。方法只接收一個(gè)參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項(xiàng)的字符串如果不給方法傳入任何值,或者給它傳入,則使用逗號(hào)作為分隔符。
引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。引用類型有時(shí)候也被稱為對(duì)象定義,因?yàn)樗麄兠枋龅氖且活悓?duì)象所具有的屬性和方法。對(duì)象是某個(gè)特定引用類型的實(shí)例,新對(duì)象是使用new操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建。
var person = new Object();5.1 Object類型
1. 創(chuàng)建Object實(shí)例
創(chuàng)建Object實(shí)例的方式有兩種:
(1)使用new操作符后跟Object構(gòu)造函數(shù)
var person = new Object(); person.name = "Chris"; person.age = 22;
(2)使用對(duì)象字面量表示法
var person = { name : "Chris", age : 22 };
注意:
1) 在對(duì)象字面量中,使用逗號(hào)來(lái)分隔不同的屬性,但在最后一個(gè)屬性后面不能添加逗號(hào)。否則在一些早 版本瀏覽器中導(dǎo)致錯(cuò)誤。
2)在使用對(duì)象字面量語(yǔ)法時(shí),屬性名也可以使用字符串;
3)使用對(duì)象字面量語(yǔ)法時(shí),如果留空其花括號(hào),則可以定義只包含默認(rèn)屬性和方法的對(duì)象,如下:
var person = {}; person.name = "Chris"; person.age = 22;
2. 訪問(wèn)對(duì)象屬性
(1)點(diǎn)表示法
alert(person.name); //"Chris"
(2)方括號(hào)表示法
alert(person["name"]); //"Chris"
注意:1)方括號(hào)表示法的主要優(yōu)點(diǎn)是可以通過(guò)變量來(lái)訪問(wèn)屬性;
var propertyName = "name"; alert(person[propertyName]); //"Chris"
2)如果屬性名中包含會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤的字符,或者屬性名使用的是關(guān)鍵字或者保留字,也可以使用方括號(hào)表示法;
person["first name"] = "Chris";
因?yàn)?first name"中包含一個(gè)空格,所以不能讓使用點(diǎn)表示法來(lái)訪問(wèn)它們,然而,屬性名中是可以包含非字母非數(shù)字的,這時(shí)候就可以使用方括號(hào)表示法來(lái)訪問(wèn)它們;
3)通常,除非必須使用變量來(lái)訪問(wèn)屬性,否則建議使用點(diǎn)表示法。
1、與其他語(yǔ)言不同的是:
(1)ECMScript數(shù)組的每一項(xiàng)可以保存任何類型的數(shù)據(jù);
(2)ECMScript數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的,即可以隨著數(shù)據(jù)的添加自動(dòng)增長(zhǎng)以容納新增數(shù)據(jù);
2、創(chuàng)建數(shù)組的基本方式有兩種:
(1)使用Array構(gòu)造函數(shù);
var colors = new Array();
(2)使用數(shù)組字面量表示法,數(shù)組字面量由一對(duì)包含數(shù)組項(xiàng)的方括號(hào)表示,多個(gè)數(shù)組之間以逗號(hào)隔開(kāi);
var colors = ["red", "blue", "yellow"];
3、在讀取和設(shè)置數(shù)組的值時(shí),要使用方括號(hào)并提供相應(yīng)值的基于0的數(shù)字索引;
var colors = ["red", "blue", "green"] //定義一個(gè)字符串?dāng)?shù)組` alert(colors[0]); //顯示第一項(xiàng) colors[2] = "black"; //修改第三項(xiàng) colors[3] = "brown"; //新增第四項(xiàng)
4、數(shù)組的項(xiàng)數(shù)保存在其length屬性中,這個(gè)屬性始終會(huì)返回0或更大的值;
var colors = ["red", "blue", "green"]; //定義一個(gè)字符串?dāng)?shù)組 alert(colors.length); //3
5、通過(guò)設(shè)置數(shù)組的length屬性,可以從數(shù)組的末尾移除項(xiàng)或者向數(shù)組中添加新項(xiàng);
var colors = ["red", "blue", "green"] //定義一個(gè)字符串?dāng)?shù)組 colors.length = 2; alert(colors[2]); //undefined(移除項(xiàng))
該例中的數(shù)組colors一開(kāi)始有3個(gè)值,將其length屬性設(shè)置為2會(huì)移除最后一項(xiàng)(位置為2的那一項(xiàng)),結(jié)果再訪問(wèn)colors[2]就會(huì)顯示undefined。如果將其length屬性設(shè)置為大于數(shù)組項(xiàng)數(shù)的值,則新增的每一項(xiàng)都回去的undefined值;
var colors = ["red", "blue", "green"] //定義一個(gè)字符串?dāng)?shù)組 colors.length = 4; alert(colors[3]); //undefined(新增項(xiàng))
利用length屬性也可以方便地在數(shù)組末尾添加新項(xiàng);
var colors = ["red", "blue", "green"] //定義一個(gè)字符串?dāng)?shù)組 colors[colors.length] = "black"; //(在位置3)添加一種顏色 colors[colors.length] = "brown"; //(在位置4)再添加一種顏色
當(dāng)把一個(gè)值放在超出當(dāng)前數(shù)組大小的位置上時(shí),數(shù)組就會(huì)重新計(jì)算其長(zhǎng)度值,即長(zhǎng)度值等于最后一項(xiàng)的索引加1。
1. 檢測(cè)數(shù)組
(1)對(duì)于一個(gè)網(wǎng)頁(yè)或者有個(gè)全局作用域而言,使用instanceof操作符就能確定某個(gè)對(duì)象是不是數(shù)組;
if (value instanceof Array) { //對(duì)數(shù)組執(zhí)行某些操作 }
(2)Array.isArray()方法的目的是最終確定某個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局執(zhí)行環(huán)境中創(chuàng)建的。
if (Array.isArray(value)) { //對(duì)數(shù)組執(zhí)行某些操作 }
2. 轉(zhuǎn)換方法
所有對(duì)象都具有toLocaleString()、toString()和valueOf()方法。其中,調(diào)用valueOf()返回的還是數(shù)組本身,而調(diào)用數(shù)組的toString()方法會(huì)返回有數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串;
toLocalString()方法經(jīng)常會(huì)返回與toString()和valueOf()方法相同的值,但也不總是如此。
(1)當(dāng)調(diào)用數(shù)組的toLocaleString()方法時(shí),調(diào)用的是每一項(xiàng)的toLocaleString()方法。
(2)采用alert()輸出時(shí),由于alert()要接收字符串參數(shù),所以它會(huì)在后臺(tái)調(diào)用toString()方法,由此會(huì)得到與直接調(diào)用toString()方法相同的結(jié)果。
數(shù)組繼承的toLocaleString()、toString()和valueOf()方法,在默認(rèn)情況下都會(huì)以逗號(hào)分隔的字符串的形式返回?cái)?shù)組項(xiàng),而如果使用join()方法,則可以使用不同的分隔符來(lái)構(gòu)建這個(gè)字符串(將數(shù)組轉(zhuǎn)化為字符串)。join()方法只接收一個(gè)參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項(xiàng)的字符串.如果不給join()方法傳入任何值,或者給它傳入undefined,則使用逗號(hào)作為分隔符。split()將字符喜轉(zhuǎn)換為數(shù)組。
var colors = ["red", "green", "blue"]; alert(colors.join(",")); //red,green,blue alert(colors.join("||")); //red||green||blue var color1 = "2:3:4:5"; color1.split(":"); //["2","3","4","5"]
3. 棧方法
棧是一種LIFO(Last-In-First-Out,先進(jìn)后出)的數(shù)據(jù)結(jié)構(gòu),也就是最新添加的項(xiàng)最早被移除。而棧中項(xiàng)的插入(叫做推入)和移除(叫做彈出),只發(fā)生在一個(gè)位置——棧的頂部。
push()方法可以接收任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長(zhǎng)度;
pop()方法從數(shù)組末尾移除最后一項(xiàng),減少數(shù)組的length值,然后返回移除的項(xiàng);
var colors = new Array(); //創(chuàng)建一個(gè)數(shù)組 var count = colors.push("red", "green"); //推入兩項(xiàng) alert(count); //2 var item = colors.pop(); //取得最后一項(xiàng) alter(item); //"green" alert(colors.length); //1
4. 隊(duì)列方法
隊(duì)列數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)規(guī)則是FIFO(First-In-First-Out,先進(jìn)先出)。隊(duì)列在列表的末端添加項(xiàng),從列表的前端移除項(xiàng);
(1)shift()方法,它能夠移除數(shù)組中的第一項(xiàng)并返回該項(xiàng),同時(shí)將數(shù)組長(zhǎng)度減1(刪除第一項(xiàng));
(2)unshift()方法,它能在數(shù)組前端添加任意個(gè)項(xiàng)并返回新數(shù)組的長(zhǎng)度。
(3)結(jié)合使用shift()和push()方法,可以像使用隊(duì)列一樣使用數(shù)組;(末端添加項(xiàng),前端移除項(xiàng))
var colors = new Array(); //創(chuàng)建一個(gè)數(shù)組 var count = colors.push("red", "green"); //推入兩項(xiàng) alert(count); //2 count = colors.push("black"); //末端推入另一項(xiàng) var item = colors.shift(); //取得第一項(xiàng) alert(item); //"red" alert(colors.length); //2 (4)同時(shí)使用unshift()和pop()方法,可以從相反的方向來(lái)模擬隊(duì)列;(前端添加項(xiàng),末端移除項(xiàng)) var colors = new Array(); //創(chuàng)建一個(gè)數(shù)組` var count = colors.push("red", "green"); //推入兩項(xiàng) alert(count); //2 count = colors.unshift("black"); //前端推入另一項(xiàng) var item = colors.pop(); //取得最后一項(xiàng) alert(item); //"green" alert(colors.length); //2
5. 重排序方法
(1)數(shù)組中已經(jīng)存在的兩個(gè)可以直接用重排序的方法:reverse()和sort()方法
reverse()方法會(huì)反轉(zhuǎn)數(shù)組項(xiàng)的順序;
在默認(rèn)情況下,sort()方法按升序排列數(shù)組項(xiàng),sort()方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()轉(zhuǎn)型方法,然后比較得到字符串,已確定如何排序,即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort()方法比較的也是字符串。
(2)比較函數(shù)(P93)
function compare(value1,value2) { if(value1 < value2) { return -1; }else if(value1 > value2){ return 1; }else{ return 0; } }
6. 操作方法
(1)concat()方法可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新的數(shù)組
(2)slice()方法能夠基于當(dāng)前數(shù)組中的一個(gè)多個(gè)項(xiàng)創(chuàng)建一個(gè)新的數(shù)組。slice()方法可以接收一個(gè)或者兩個(gè)參數(shù),即要返回項(xiàng)的起始和結(jié)束位置。在只有一個(gè)參數(shù)的情況下,slice()方法返回從該參數(shù)指定位置開(kāi)始到當(dāng)前數(shù)組末尾的所有項(xiàng);如果有兩個(gè)參數(shù),該方法返回起始和結(jié)束位置之間的項(xiàng)——但不包括結(jié)束位子的項(xiàng)。注意,slice()方法不會(huì)影響原始數(shù)組。
var colors = ["red", "green", "blue", "yellow","purple"]; var colors2 = colors.silce(1); var colors3 = colors.slice(1,4); alert(colors2); //green,blue,yellow,purple alert(colors3); //green,blue,yellow
注意:
1)如果slice方法的參數(shù)中有一個(gè)附屬,則用數(shù)組長(zhǎng)度加上該數(shù)來(lái)確定相應(yīng)的位置;
2)如果結(jié)束位置小于起始位置,則返回空數(shù)組
(3)splice()方法的主要用途是向數(shù)組的中部插入項(xiàng)
1)刪除:可以刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù):splice(要?jiǎng)h除的第一項(xiàng)的位置,要?jiǎng)h除的項(xiàng)數(shù))
2)插入:可以向指定位置插入任意數(shù)量的項(xiàng),只需提供3個(gè)參數(shù)splice(起始位置,要?jiǎng)h除的項(xiàng)數(shù),要插入的項(xiàng))
3)替換:可以向指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定3個(gè)參數(shù)
splice(起始位置,要?jiǎng)h除的項(xiàng)數(shù),要插入的任意數(shù)量的項(xiàng)),插入的項(xiàng)數(shù)不必與刪除的項(xiàng)數(shù)相等;
var colors = ["red", "green", "blue"]; var removed = colors.splice(0,1) //刪除第一項(xiàng) alert(colors); //green,blue alert(removed); //red,返回的數(shù)組中只包含一項(xiàng) removed = colors.splice(1,0,"yellow","orange"); //從位置1開(kāi)始插入兩項(xiàng) alert(colors); //green,yellow,orange,blue alert(removed); //返回的是一個(gè)空數(shù)組 removed = colors.splice(1,1,"red","purple"); //插入兩項(xiàng),刪除一項(xiàng) alert(colors); //green,red,purple,orange,blue alert(removed); //yellow,返回的數(shù)組中只包含一項(xiàng)
7. 位置方法
indexOf()和lastIndexOf(),這兩個(gè)方法都接收兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找起點(diǎn)位置的索引。其中,indexOf()方法從數(shù)組的開(kāi)頭(位置0 )開(kāi)始向后查找。LastIndexOf()方法則從數(shù)組的末尾向前查找。這兩個(gè)方法都返回要查找的項(xiàng)在數(shù)組中的位置,或者在沒(méi)有找到的情況下返回-1.
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. 迭代方法
每個(gè)方法都接收兩個(gè)參數(shù):要在每一項(xiàng)運(yùn)行的函數(shù)和(可選的)運(yùn)行該函數(shù)的作用域?qū)ο?。傳入這些方法中的函數(shù)會(huì)接收三個(gè)參數(shù):數(shù)組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身。
every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true;
filter():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組;
forEach():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),該方法沒(méi)有返回值;
map():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組;
some():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)任一項(xiàng)返回true,則返回true。
var numbers = [1,2,3,4,5,4,3,2,1]; var everyResult = numbers.every(function(item,index,array){ return (itrem>2); }); alert(everyResult); //false var someResult = numbers.every(function(item,index,array){ return (itrem>2); }); alert(someResult); //true
注意:對(duì)every()來(lái)說(shuō),傳入的函數(shù)必須對(duì)每一項(xiàng)都返回true,這個(gè)方法才返回true;而some()方法則是只要傳入的函數(shù)對(duì)數(shù)組中的某一項(xiàng)返回true,就會(huì)返回true。
9. 歸并方法
ECMAScript5新增了兩個(gè)歸并數(shù)組的方法:reduce()和reduceRight()。這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回值。其中reduce()方法從數(shù)組的第一項(xiàng)開(kāi)始,逐個(gè)遍歷到最后。而reduceRight()則從數(shù)組的最后一項(xiàng)開(kāi)始,向前遍歷到第一項(xiàng)。
以上兩種方法都接收兩個(gè)參數(shù):在每一項(xiàng)調(diào)用的函數(shù)、作為歸并基礎(chǔ)的初始值。
傳給reduce()和reduceRight()的函數(shù)接收四個(gè)參數(shù):前一個(gè)值、當(dāng)前值、項(xiàng)的索引和數(shù)組對(duì)象。這個(gè)函數(shù)返回的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。以第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上,因此第一個(gè)參數(shù)是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)就是數(shù)組的第二項(xiàng)。
var values = [1,2,3,4,5]; var sum = values.reduce(function(prev, cur, index, array){ return prev + cur; }); alert(sum); //155.3 Date類型
要?jiǎng)?chuàng)建一個(gè)日期對(duì)象,使用new操作符和Date構(gòu)造函數(shù)即可
var now = new Date();
//在調(diào)用Date構(gòu)造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對(duì)象自動(dòng)獲得當(dāng)前日期和時(shí)間
如果想根據(jù)特定的日期和時(shí)間創(chuàng)建日期對(duì)象,必須傳入該日期的毫秒數(shù)。或者使用Date.parse()和Date.UTC();
Date.parse()方法接收一個(gè)表示日期的字符串參數(shù),然后嘗試根據(jù)這個(gè)字符串返回相應(yīng)日期的毫秒數(shù);如果傳入Date.parse()方法的字符串不能表示日期,那么它會(huì)返回NaN;如果直接將表示日期的字符串傳遞給Date構(gòu)造函數(shù),也會(huì)在后臺(tái)調(diào)用Date.parse()。
Date.UTC()方法同樣也返回表示日期的毫秒數(shù),Date.UTC()的參數(shù)分別是年份、基于0的月份,月中的哪一天(1到31)、小時(shí)數(shù)(0到23)、分鐘、秒以及毫秒數(shù)。在這些參數(shù)中,只有年和月是必需的
Date.now()方法,返回表示調(diào)用這個(gè)方法時(shí)的日期和時(shí)間的毫秒數(shù)。
1. 繼承的方法
Date類型也重寫了toLocaleString()、toString()和valueOf()方法。
Date類型的toLocaleString()方法會(huì)按照與瀏覽器設(shè)置的時(shí)區(qū)相適應(yīng)的格式返回日期和時(shí)間。(大致意味時(shí)間格式中會(huì)包含AM或PM,但不會(huì)包含時(shí)區(qū)信息);
Date類型的toString()方法則通常返回帶有時(shí)區(qū)信息的日期和時(shí)間,其中時(shí)間一般以軍用時(shí)間表示;
Date類型的valueOf()方法則根本不返回字符串,而是返回日期的毫秒表示。因此,可以方便使用比較操作符(小于或大于)來(lái)比較日期值。
2. 日期格式化方法
toDateString()——以特定于實(shí)現(xiàn)的格式顯示星期幾、月、日和年;
toTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒和時(shí)區(qū);
toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月、日和年;
toLocaleTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒和時(shí)區(qū);
toUTCString()——以特定于實(shí)現(xiàn)的格式完整的UTC日期;
3. 日期/時(shí)間組件方法 (P102)
5.4 RegExp類型RegExp類型是用來(lái)支持正則表達(dá)式:
(1)第一種創(chuàng)建正則表達(dá)式的方法如下:
var expression = / pattern / flags;
其中的模式(pattern)部分可以是任何簡(jiǎn)單或復(fù)雜的正則表達(dá)式,可以包含字符類、限定符、分組、向前查找以及反向引用。
每個(gè)正則表達(dá)式都可以帶有一個(gè)或者多個(gè)標(biāo)志(flags),用以標(biāo)明正則表達(dá)式的行為。正則表達(dá)式的匹配模式支持下列3個(gè)標(biāo)志:
g:表示全局(global)模式,即模式將被應(yīng)用于所有字符串,而非在發(fā)現(xiàn)第一個(gè)匹配項(xiàng)時(shí)立即停止;
i:表示不區(qū)分大小寫(case-insensitive)模式,即在確定匹配項(xiàng)時(shí)忽略模式與字符串的大小寫;
m:表示多行(multiline)模式,即在到達(dá)一行文本末尾時(shí)還會(huì)繼續(xù)查找下一行是否存在與模式匹配的項(xiàng)
模式中使用的所有元字符都必須轉(zhuǎn)義。正則表達(dá)式中的元字符包括:( [ { ^ $ | ) ? * + . ] }
(2)另一種創(chuàng)建正則表達(dá)式的方式是使用RegExp函數(shù),它接收兩個(gè)參數(shù):一個(gè)是要匹配的字符串模式,另一個(gè)是可選的標(biāo)志字符串。
//匹配第一個(gè)"bat"或"cat",不區(qū)分大小寫
var pattern1 = /[bc]at/i; //使用第一種方法創(chuàng)建
var pattern2 = new RegExp("[bc]at","i"); //使用RegExp函數(shù)實(shí)現(xiàn)
由于RegExp構(gòu)造函數(shù)的模式參數(shù)是字符串,所以在某些情況下要對(duì)字符串進(jìn)行雙重轉(zhuǎn)義。
正則表達(dá)式字面量始終會(huì)共享同一個(gè)RegExp實(shí)例,而使用構(gòu)造函數(shù)創(chuàng)建的每一個(gè)新RegExp實(shí)例都是一個(gè)新實(shí)例。
1. RegExp實(shí)例屬性
global:布爾值,表示是否設(shè)置了g標(biāo)志;
ignoreCase:布爾值,表示是否設(shè)置了i標(biāo)志;
lastIndex:整數(shù),表示開(kāi)始搜索下一個(gè)匹配項(xiàng)的字符位置,從0算起。
multiline:布爾值,表示是否設(shè)置了m標(biāo)志;
source:正則表達(dá)式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)的字符串模式返回。
source屬性保存的是規(guī)范形式的字符串,即字面量形式所用的字符串。
2. RegExp實(shí)例方法
正則表達(dá)式的第一個(gè)方法是exec()鏈接描述: 接收一個(gè)參數(shù),即要應(yīng)用模式的字符串,然后返回包含第一個(gè)匹配信息的數(shù)組;或者在沒(méi)有匹配項(xiàng)的情況下返回null。exec() 方法還返回兩個(gè)屬性。index 屬性聲明的是匹配文本的第一個(gè)字符的位置(匹配項(xiàng)在字符串中的位置)。input 屬性則存放的是被檢索的字符串 string(表示應(yīng)用正則表達(dá)式的字符串)。
在數(shù)組中,第一項(xiàng)是與整個(gè)模式匹配的字符串,其他項(xiàng)是與模式中的捕獲組匹配的字符串(如果模式中沒(méi)有捕獲組,則該數(shù)組只包含一項(xiàng))
var text = "mom and dad and baby"; var pattern = /mom( and dad( and baby)?)?/gi; var matches = pattern.exec(text); alert(matches.index); //0 alert(matches.input); //"mom and dad and baby" alert(matches[0]); //"mom and dad and baby" alert(matches[1]); //"and dad and baby" alert(matches[2]); //"and baby"
對(duì)于exec()方法而言,即使在模式中設(shè)置了全局標(biāo)志(g),他每次也只會(huì)返回一個(gè)匹配項(xiàng)。在不設(shè)置全局標(biāo)志的情況下,在同一個(gè)字符串上多次調(diào)用exec()將始終返回第一個(gè)匹配項(xiàng)的信息,而在設(shè)置全局變量的情況下,每次調(diào)用exec()則都會(huì)在字符串中繼續(xù)查找新匹配項(xiàng)。
正則表達(dá)式的第二個(gè)方法是test()鏈接描述:它接受一個(gè)字符串參數(shù),如果字符串 string 中含有與RegExpObject 匹配的文本,則返回true,否則返回false
3. RegExp構(gòu)造函數(shù)屬性
input:最近一次要匹配的字符串["$_"]
lastMatch:最近一次與整個(gè)正則表達(dá)式匹配的字符串["$&"]
lastParen:最近一次匹配的捕獲組["$+"]
leftContext:input字符串中l(wèi)astMatch之前的文本["$`"]
rightContext:input字符串中l(wèi)astMatch之后的文本["$""]
multiline:布爾值,表示是否所有表達(dá)式都使用多行模式["$*"]
var text = "this has been a short summer"; var pattern = /(.)hort/g; if(pattern.test(text)){ alert(RegExp.input); //this has been a short summer alert(RegExp.leftContext); //this has been alert(RegExp.rightContext); //summer alert(RegExp.lastMatch); //short alert(RegExp.lastParen); //a alert(RegExp.multiline); //false }
注意:以上使用的長(zhǎng)屬性名都可以用相應(yīng)的短屬性名來(lái)代替,不過(guò)短屬性名不是有效的ECMAScript標(biāo)識(shí)符,因此必須通過(guò)方括號(hào)語(yǔ)法來(lái)訪問(wèn)它們。
var text = "this has been a short summer"; var pattern = /(.)hort/g; if(pattern.test(text)){ alert(RegExp.$_); //this has been a short summer alert(RegExp["`$`"]); //this has been alert(RegExp["$""]); //summer alert(RegExp["$&"]); //short alert(RegExp["$+"]); //a alert(RegExp["$*"]); //false }
4. 模式的局限性 (P109)
5.5 Function類型1. 沒(méi)有重載(深入理解)
2. 函數(shù)聲明與函數(shù)表達(dá)式
3. 作為值的函數(shù)
4. 函數(shù)的內(nèi)部屬性
在函數(shù)內(nèi)部,有兩個(gè)特殊的對(duì)象:arguments和this
(1)arguments是一個(gè)類數(shù)組對(duì)象,包含著傳入函數(shù)中的所有參數(shù),它的主要用途是保存函數(shù)參數(shù)。這個(gè)對(duì)象還有一個(gè)名叫callee的屬性,該屬性是一個(gè)指針,指向擁有這個(gè)arguments對(duì)象的函數(shù)。
function factorial(num) { if (num<=1) { return 1; } else { return num*factorial(num-1); } }
轉(zhuǎn)變?yōu)?/p>
function factorial(num) { if (num<=1) { return 1; } else { return num*arguements.callee(num-1); } }
在這個(gè)重寫后的factorial()函數(shù)的函數(shù)體內(nèi),沒(méi)有再引用函數(shù)名factorial。這樣,無(wú)論引用函數(shù)時(shí)使用的是什么名字,都可以保證正常完成遞歸調(diào)用。
(2)函數(shù)內(nèi)部的另一個(gè)特殊對(duì)象是this。this引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象(當(dāng)在網(wǎng)頁(yè)的全局作用域中調(diào)用函數(shù)時(shí),this對(duì)象引用的就是window)
!函數(shù)的名字僅僅是一個(gè)包含指針的變量而已
EMAScript也規(guī)范了另一個(gè)函數(shù)對(duì)象的屬性:caller這個(gè)屬性保存著 調(diào)用當(dāng)前函數(shù)的函數(shù)的引用
5. 函數(shù)屬性和方法
每個(gè)函數(shù)都包含兩個(gè)屬性:length 和prototype
(1)length屬性表示函數(shù)希望接收的命名參數(shù)的個(gè)數(shù)
(2)prototype屬性是保存他們所有實(shí)例方法的真正所在
(3)每個(gè)函數(shù)都包含兩個(gè)非繼承而來(lái)的方法:apply()和call(),這兩個(gè)方法的用途都是在特定的作用域中調(diào)用函數(shù),實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值。
apply()方法接收兩個(gè)參數(shù):在其中運(yùn)行的函數(shù)的作用域 和 參數(shù)數(shù)組
call()方法:第一個(gè)參數(shù)是this值沒(méi)有變化,變化的是其余參數(shù)都直接傳遞給函數(shù)。換句話說(shuō),在使用call()方法時(shí),傳遞給函數(shù)的參數(shù)必須逐個(gè)列舉出來(lái)。
function sum(num1,num2) { return num1+num2; } function callSum1(num1,num2) { return sum.apply(this,arguments); //傳入arguments對(duì)象 } function callSum2(num1,num2) { return sum.apply(this,[num1,num2]); //傳入數(shù)組 } function callSum3(num1,num2) { return sum.call(this,num1,num2); //其余參數(shù)都直接傳遞給函數(shù)` } alert(callSum1(10,10)); //20 alert(callSum2(10,10)); //20 alert(callSum3(10,10)); //20
apply()和call()真正的用武之地在——能夠擴(kuò)充函數(shù)賴以運(yùn)行的作用域
windows.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
使用apply()或call()來(lái)擴(kuò)充作用于的最大好處就是,對(duì)象不需要與方法有任何耦合關(guān)系。
(4)bind()方法。這個(gè)方法會(huì)創(chuàng)建一個(gè)函數(shù)的實(shí)例,其this值會(huì)被綁定到傳給bind()函數(shù)的值。
windows.color = "red"; var o = {color : "blue"}; function sayColor() { alert(this.color); } var objectSayColor= sayColor.bind(o); objectSayColor(); //blue5.6 基本包裝類型
ECMAScript提供了3種特殊的引用類型:Boolean、Number和String
引用類型與基本包裝類型的主要區(qū)別就是對(duì)象的生存周期。使用new操作符創(chuàng)建的引用類型的實(shí)例,在執(zhí)行流離開(kāi)當(dāng)前作用域之前都一直保存在內(nèi)存中。而自動(dòng)創(chuàng)建的基本包裝類型的對(duì)象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷毀。這意味著我們不能在運(yùn)行時(shí)為基本類型值添加屬性和方法。
var s1 = "some text"; s1.color = "red"; alert(s1.color); //undefined
!注意:使用new調(diào)用基本包裝類型的構(gòu)造函數(shù),與直接調(diào)用同名的轉(zhuǎn)型函數(shù)是不一樣的
var value = "25"; var number = Number(value); //轉(zhuǎn)型函數(shù) alert(typeof number); //"number" var obj = new Number(value); //構(gòu)造函數(shù) alert(type of obj); //"object"
1. Boolean類型
(1)Boolean類型是與布爾值對(duì)應(yīng)的引用類型。要?jiǎng)?chuàng)建Boolean對(duì)象,可以像下面這樣調(diào)用Boolean構(gòu)造函數(shù)并傳入true或者false值。
var BooleanObject= newBoolean(true);
Boolean類型的實(shí)例重寫了valueOf()方法,返回基本類型值true或false;重寫了toString()方法,返回字符串"true"和"flase"。
var falseObject = new Boolean(false); var result = falseObject && true; alert(result); //true (布爾表達(dá)式中的所有對(duì)象都會(huì)被轉(zhuǎn)化為true,因此falseObject對(duì)象在布爾表達(dá)式中代表的是true,結(jié)果true&&true就等于true)
(2)基本類型與引用類型的布爾值還有兩個(gè)區(qū)別:
1)typeof操作符對(duì)基本類型返回"boolean",而對(duì)引用類型返回"object";
2)由于Boolean對(duì)象是Boolean類型的實(shí)例,所以使用instanceof操作符測(cè)試Boolean對(duì)象會(huì)返回true,而測(cè)試基本類型的布爾值則返回false。
var falseObject = new Boolean(false); var falseValue = false; alert(typeof falseObject); //Object alert(typeof falseValue); //boolean alert(falseObject instanceof Boolean); //true alert(falseValue instanceof Boolean); //false
2. Number類型
(1)要?jiǎng)?chuàng)建Number對(duì)象,可以在調(diào)用Number構(gòu)造函數(shù)時(shí)向其中傳遞相應(yīng)的數(shù)值。
var numberObject = new Number(10);
(2)Number類型也重寫了valueOf()、toLocaleString()和toString()方法。重寫后的valueOf()方法返回對(duì)象表示的基本類型的值,另外兩個(gè)方法則返回字符串形式的數(shù)值。
(3)toFixed()方法會(huì)按照指定的小數(shù)位返回?cái)?shù)值的字符串表示。
var num = 10; alert(num.toFixed(2)); //"10.00"
如果數(shù)值本身包含的小數(shù)位比指定的還多,那么接近指定的最大小數(shù)位的值就會(huì)被舍入。
var num = 10.005; alert(num.toFixed(2)); //"10.01"
(4)toExponential()可用于格式化數(shù)值,該方法返回以指數(shù)表示法表示的數(shù)值的字符串形式。toExponential()也接收一個(gè)參數(shù),而且該參數(shù)同樣也是指定輸出結(jié)果的小數(shù)位數(shù)。
var num = 10; alert(num.toExponential(1)); //"1.0e+1"
(5)toPrecision()方法可能會(huì)返回固定大?。╢ixed)格式,也可能返回指數(shù)(exponential)格式。這個(gè)方法接收一個(gè)參數(shù),即表示數(shù)值的所有數(shù)字的位數(shù)(不包括指數(shù)部分)。
var num = 99; alert(num.toPrecision(1)); //"1e+2" alert(num.toPrecision(2)); //"99" alert(num.toPrecision(3)); //"99.0"
3. String類型
見(jiàn)鏈接描述
1. Global對(duì)象
2. Math對(duì)象
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102461.html
摘要:具體來(lái)說(shuō)就是當(dāng)執(zhí)行流進(jìn)入下列任何一個(gè)語(yǔ)句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語(yǔ)句的塊和語(yǔ)句。這兩個(gè)語(yǔ)句都會(huì)在作用域鏈的前端添加一個(gè)變量對(duì)象。對(duì)來(lái)說(shuō),會(huì)將指定的對(duì)象添加到作用域鏈中。 1. 基本類型和引用類型的值 JavaScript變量可以用來(lái)保存兩種類型的值:基本類性值和引用類性值?;绢愋椭翟醋砸韵?種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String?;?..
摘要:工廠模式?jīng)]有解決對(duì)象識(shí)別的問(wèn)題即怎樣知道一個(gè)對(duì)象的類型構(gòu)造函數(shù)模式使用構(gòu)造函數(shù)的主要問(wèn)題,就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍。創(chuàng)建要返回的對(duì)象可以在這里定義私有變量和函數(shù)添加函數(shù)注意寄生構(gòu)造函數(shù)中是返回對(duì)象注意寄生構(gòu)造函數(shù)中是 1、工廠模式 沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(即怎樣知道一個(gè)對(duì)象的類型) function createPerson(name, age, job) { ...
摘要:遞歸閉包模仿塊級(jí)作用域私有變量小結(jié)在編程中,使用函數(shù)表達(dá)式可以無(wú)需對(duì)函數(shù)命名,從而實(shí)現(xiàn)動(dòng)態(tài)編程。匿名函數(shù)也稱為拉姆達(dá)函數(shù)。函數(shù)聲明要求有名字,但函數(shù)表達(dá)式不需要。中的函數(shù)表達(dá)式和閉包都是極其有用的特性,利用它們可以實(shí)現(xiàn)很多功能。 1、遞歸 2、閉包 3、模仿塊級(jí)作用域 4、私有變量 5、小結(jié) 在JavaScript編程中,使用函數(shù)表達(dá)式可以無(wú)需對(duì)函數(shù)命名,從而實(shí)現(xiàn)動(dòng)態(tài)編程。匿名函數(shù)也稱...
摘要:寫在前面本文記錄的是我不熟悉或者我認(rèn)為值得注意的地方,并不是書(shū)上知識(shí)點(diǎn)的概括第章變量作用域和內(nèi)存問(wèn)題對(duì)象是按引用傳遞的我理解的是傳值其實(shí)傳的是一個(gè)指針,該指針指向內(nèi)存中的某個(gè)對(duì)象。 寫在前面 本文記錄的是我不熟悉或者我認(rèn)為值得注意的地方,并不是書(shū)上知識(shí)點(diǎn)的概括 第4章 變量、作用域和內(nèi)存問(wèn)題 對(duì)象是按引用傳遞的(我理解的是傳值其實(shí)傳的是一個(gè)指針,該指針指向內(nèi)存中的某個(gè)對(duì)象)。舉例如下...
摘要:大多數(shù)情況下,可以是同局部變量完成相同的事情而不引入新的作用域。選擇正確的方法避免不必要的屬性查找一旦多次用到屬性對(duì)象,應(yīng)該將其存儲(chǔ)在局部變量中。盡可能多的使用局部變量將屬性查找替換為值查找。 1、可維護(hù)性 1.1 可維護(hù)代碼特征 1. 可理解性 2. 直觀性 3. 可適應(yīng)性 4. 可擴(kuò)展性 5. 可調(diào)試性 1.2 代碼約定 1、可讀性(代碼縮進(jìn)和代碼注釋) 2、變量和函數(shù)命名 變量...
摘要:除此之外,在超類型的原型中定義的方法,對(duì)子類型而言也是不可兼得,結(jié)果所有類型都只能用構(gòu)造函數(shù)模式。創(chuàng)建對(duì)象增強(qiáng)對(duì)象指定對(duì)象繼承屬性這個(gè)例子的高效率體現(xiàn)在它只調(diào)用了一次構(gòu)造函數(shù)。 1、原型鏈 原型鏈的基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象;原型對(duì)象都包含著一個(gè)指向構(gòu)造函數(shù)的指針;實(shí)例都包含一個(gè)指向原型對(duì)象的...
閱讀 964·2023-04-25 23:50
閱讀 1994·2021-11-19 09:40
閱讀 608·2019-08-30 13:50
閱讀 2736·2019-08-29 17:11
閱讀 1051·2019-08-29 16:37
閱讀 2996·2019-08-29 12:54
閱讀 2803·2019-08-28 18:17
閱讀 2647·2019-08-26 16:55