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

JavaScript高級(jí)教程5.6之基本包裝類(lèi)型(詳細(xì))

 更新時(shí)間:2015年11月23日 09:31:53   作者:sunshinegirl_7  
在基本類(lèi)型當(dāng)中,有三種類(lèi)型是我們經(jīng)常使用的:boolean,number,string,通過(guò)本篇文章給大家介紹javascript高級(jí)教程5.6之基本包裝類(lèi)型,感興趣的朋友一起學(xué)習(xí)吧

為了便于操作基本類(lèi)型值,ECMAScript還提供了3個(gè)特殊的引用類(lèi)型:Boolean,Number,String.

實(shí)際上,每當(dāng)讀取一個(gè)基本類(lèi)型值的時(shí)候,后臺(tái)應(yīng)付創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類(lèi)型的對(duì)象,從而讓我們能夠調(diào)用一些方法來(lái)操作這些數(shù)據(jù).

var s1="some text";
  var s2=s1.substring(2);
  console.log(s2);//me text

這個(gè)例子中s1包含了一個(gè)字符串,字符串是基本類(lèi)型值.第二行調(diào)用了s1的subsstring()方法,并將返回的結(jié)果保存在了s2中.

當(dāng)?shù)诙写a訪問(wèn)s1時(shí),,訪問(wèn)過(guò)程處于一種讀取模式,也就是要從內(nèi)存中讀取這個(gè)字符串的值.而在讀取模式中訪問(wèn)字符串時(shí),后臺(tái)會(huì)自動(dòng)完成下列處理.

(1)創(chuàng)建String類(lèi)型的一個(gè)實(shí)例;

(2)在實(shí)例上調(diào)用指定的方法;

(3)銷(xiāo)毀這個(gè)實(shí)例.

可以將以上三個(gè)步驟想象成是執(zhí)行了下列代碼:

var s1=new String("some text");
  var s2=s1.substring(2);
  s1=null;
  console.log(s2);//me text

經(jīng)過(guò)此番處理,基本的字符串值就變得跟對(duì)象一樣了.而且上面三個(gè)步驟也分別適用于Boolean和Number類(lèi)型對(duì)應(yīng)的布爾值和數(shù)字值.

引用類(lèi)型與基本包裝類(lèi)型的主要區(qū)別就是對(duì)象的生存期.

使用new操作符創(chuàng)建的引用類(lèi)型的實(shí)例,在執(zhí)行流離開(kāi)當(dāng)前作用域之前都一起保存在內(nèi)存中.而自動(dòng)創(chuàng)建的基本包裝類(lèi)型的對(duì)象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷(xiāo)毀.這意味著我們不能在運(yùn)行時(shí)為基本類(lèi)型添加屬性和方法.

var s1="some text";
  s1.color="red";
  console.log(s1.color);//undefined

問(wèn)題的原因就是第二行創(chuàng)建的String對(duì)象在執(zhí)行第三行代碼時(shí)已經(jīng)被銷(xiāo)毀了.第三行代碼又創(chuàng)建自己的String對(duì)象,而該對(duì)象沒(méi)有color屬性.

對(duì)基本包裝類(lèi)型的實(shí)例調(diào)用typeof會(huì)返回"object",而且所有基本包裝類(lèi)型的對(duì)象都會(huì)被轉(zhuǎn)換為布爾值true.

Object構(gòu)造函數(shù)也會(huì)像工廠方法一樣,根據(jù)傳入值的類(lèi)型返回相應(yīng)基本包裝類(lèi)型的實(shí)例.

var obj=new Object("some text");
  console.log(obj instanceof String);//true

把字符串傳給Object構(gòu)造函數(shù),就會(huì)創(chuàng)建String的實(shí)例,而傳入數(shù)值參數(shù)會(huì)得到Number的實(shí)例,傳入布爾值參數(shù)就會(huì)得到Boolean的實(shí)例.

要注意的是,使用new調(diào)用基本包裝類(lèi)型的構(gòu)造函數(shù),與直接調(diào)用同名的轉(zhuǎn)型函數(shù)是不一樣的.

var value="25";
  var number=Number(value);//轉(zhuǎn)型函數(shù)
  console.log(typeof number);//number
  var obj=new Number(value);//構(gòu)造函數(shù)
  console.log(typeof obj);//object

在這個(gè)例子中,變量number中保存的是基本類(lèi)型的值25,而變量obj中保存的是Number的實(shí)例.

5.6.1 Boolean類(lèi)型

Boolean類(lèi)型是與布爾值對(duì)應(yīng)的引用類(lèi)型.要?jiǎng)?chuàng)建Boolean對(duì)象,可以像下面這樣調(diào)用Boolean構(gòu)造函數(shù)并傳入true或false值.

var booleanObject=new Boolean(true);

Boolean類(lèi)型的實(shí)例重寫(xiě)了valueOf()方法,返回基本類(lèi)型值true或false;重寫(xiě)了toString()方法,返回字符串"true”和"false".可是,Boolean對(duì)象在ECMAScript中的用處不大,因?yàn)樗?jīng)常會(huì)造成人們的誤解.

其中最常見(jiàn)的問(wèn)題是在布爾表達(dá)式中使用Boolean對(duì)象.

var falseObject=new Boolean(false);
  var result=falseObject&&true;
  console.log(result);//true
  var falseValue=false;
  result=falseValue&&true;
  console.log(result);//false

在這個(gè)例子中,使用false值創(chuàng)建了一個(gè)Boolean對(duì)象.然后將這個(gè)對(duì)象與基本類(lèi)型值true構(gòu)造了邏輯與表達(dá)式.示例中這行代碼是對(duì)falseObject而不是它的值(false)進(jìn)行求值.布爾表達(dá)式中所有對(duì)象都會(huì)被轉(zhuǎn)換成true,因此falseObject對(duì)象在布爾表達(dá)式中代表的是true.

基本類(lèi)型與引用類(lèi)型的布爾值還有兩個(gè)區(qū)別:首先,typeof操作對(duì)基本類(lèi)型返回”boolean”,而對(duì)引用類(lèi)型返回”object”.其次,由于 Boolean對(duì)象是Boolean類(lèi)型的實(shí)例,所以使用instanceof操作符測(cè)試Boolean對(duì)象會(huì)返回true,而測(cè)試基本類(lèi)型的布爾值則返回false.

console.log(typeof falseObject);//object
  console.log(typeof falseValue);//boolean
  console.log(falseObject instanceof Boolean);//true
  console.log(falseValue instanceof Boolean);//false

5.6.2 Number類(lèi)型

Number是與數(shù)字值對(duì)應(yīng)的引用類(lèi)型.要?jiǎng)?chuàng)建Number對(duì)象,可以在調(diào)用Number構(gòu)造函數(shù)時(shí)向其中傳遞相應(yīng)的數(shù)值.

var numberObject=new Number(10);
  console.log(typeof numberObject);//object

與Boolean類(lèi)型一樣,Number類(lèi)型也重寫(xiě)了valueOf(),toLocaleString()和toString()方法.

重寫(xiě)后的valueOf()方法返回對(duì)象表殼的基本類(lèi)型的數(shù)值,另外兩個(gè)方法則返回字符串形式的數(shù)值.

可以為toString()方法傳遞一個(gè)表示基數(shù)的參數(shù),告訴它返回幾進(jìn)制數(shù)值的字符串形式.

var num=10;
  console.log(num.toString());//10
  console.log(num.toString(2));//1010
  console.log(num.toString(8));//12
  console.log(num.toString(10));//10
  console.log(num.toString(16));//a

除了繼承的方法之外,Number類(lèi)型還提供了一些用于將數(shù)值格式化為字符串的方法.

其中,toFixed()方法會(huì)按照指定的小數(shù)位返回?cái)?shù)值的字符串表示.

var num=10;
    console.log(num.toFixed(2));//10.00

這里給toFixed()方法傳入了數(shù)值2,意思是顯示幾位小數(shù).以0填補(bǔ)了必要的小數(shù)位.

如果數(shù)值本身包含的小數(shù)位比指定的還多,那么接近指定的最大小數(shù)位的值就會(huì)舍入.

var num=10.007;
  console.log(num.toFixed(2));//10.01

能夠自動(dòng)舍入的特性,使得toFixed()方法很適合處理貨幣值.但需要注意的是,不同瀏覽器給這個(gè)方法設(shè)定的舍入規(guī)則可能會(huì)有所不同.在給toFixed()傳入0的情況下,IE8及之前的版本不能正確舍入范圍在{(-0.94,-0.5],[0.5,0.94)}之間的值.對(duì)于這個(gè)范圍內(nèi)的值,IE會(huì)返回0,而不是-1或1;其他瀏覽器都能返回正確的值.IE9修復(fù)了這個(gè)問(wèn)題.

另外可用于格式 化數(shù)值的方法是toExponential(),該方法返回以指數(shù)表示法(也稱(chēng)e表示法)表示數(shù)值的字符串形式.與toFixed()方法一樣,toExponential()也接收一個(gè)參數(shù),而且該參數(shù)同樣也是指定輸出結(jié)果中的小數(shù)位數(shù).

var num=10;
  console.log(num.toExponential(1));//1.0e+1

對(duì)于一個(gè)數(shù)值來(lái)說(shuō),toPrecision()方法可能會(huì)返回固定大小(fixed)格式,也可能返回指定(exponential)格式;具體規(guī)則是看哪種格式最合適.這個(gè)方法接收一個(gè)參數(shù),即表示數(shù)值的所有數(shù)字的位數(shù)(不包括指數(shù)部分).

var num=99;
  console.log(num.toPrecision(1));//1e+2
  console.log(num.toPrecision(2));//99
  console.log(num.toPrecision(3));//99.0

第二行是用一位數(shù)來(lái)表示99,第三行是用兩位數(shù)來(lái)表示,第四行是用三位數(shù)來(lái)表示.

實(shí)際上,toPrecision()會(huì)根據(jù)要處理的數(shù)值決定到底是調(diào)用toFixed()還是調(diào)用toExponential(),而這三個(gè)方法都可以通過(guò)向上或向下舍入,做到以最準(zhǔn)確的形式來(lái)表示帶有正確小數(shù)位的值.

toPrecision()方法可以表現(xiàn)1到21位小數(shù).

仍然不建議直接實(shí)例化Number類(lèi)型.具體來(lái)講,就是在使用typeof和instanceof操作符測(cè)試基本類(lèi)型數(shù)值與引用類(lèi)型數(shù)值時(shí),得到的結(jié)果完全不同.

var numberObject=new Number(10);
  var numberValue=10;
  console.log(typeof numberObject);//object
  console.log(typeof numberValue);//number
  console.log(numberObject instanceof Number);//true
  console.log(numberValue instanceof Number);//false

在使用typeof操作符測(cè)試基本類(lèi)型數(shù)值時(shí),始終會(huì)返回"number",而在測(cè)試Number對(duì)象時(shí),則會(huì)返回"object”.類(lèi)似地,Number對(duì)象是Number類(lèi)型的實(shí)例,而基本類(lèi)型的數(shù)值則不是.

5.6.3 String類(lèi)型

String類(lèi)型是字符串的對(duì)象包裝類(lèi)型,可以像下面這樣使用String構(gòu)造函數(shù)來(lái)創(chuàng)建.

var stringObject=new String("hello world");

String對(duì)象的方法也可以在所有基本的字符串值中訪問(wèn)到.其中,繼承的valueOf(),toLoaleString()和toString()方法,都返回對(duì)象所表示的基本字符串值.

String類(lèi)型的每個(gè)實(shí)例都有一個(gè)length屬性,表示字符串包含多個(gè)字符.

var stringValue="hello world";
  console.log(stringValue.length);

應(yīng)該注意的是,即使字符串中包含雙字節(jié)字符(不是占一個(gè)字節(jié)的ASCII字符),每個(gè)字符也仍然算一個(gè)字符.

1.字符方法

兩個(gè)用于訪問(wèn)字符串中特定字符的方法是:charAt()和charCodeAt().這兩個(gè)方法都接收一個(gè)參數(shù),即基于0的字符位置.

charAt()方法以單字符字符串的形式返回給定位置的那個(gè)字符.

如果想得到的不是字符而是字符編碼,就需要使用charCodeAt()了.

ECMAScript還定義了另一個(gè)訪問(wèn)個(gè)別字符的方法.在支持此方法的瀏覽器中,可以使用方括號(hào)加數(shù)字索引來(lái)訪問(wèn)字符串中的特定字符.

var stringValue="hello world";
  console.log(stringValue[1]);//e

使用方括號(hào)表示法訪問(wèn)個(gè)別字符的語(yǔ)法得到了IE8及FF,Safari,Chrome和Opera所有版本的支持.如果在IE7及更早版本中使用這種語(yǔ)法,會(huì)返回undefined值.

2.字符串操作方法

concat(),用于將一或多個(gè)字符串拼接起來(lái),返回拼接得到的新字符串.

var stringValue="hello";
  var result=stringValue.concat("world");
  console.log(result);//helloworld
  console.log(stringValue);//hello

concat()返回一個(gè)拼接的字符串,不改變?cè)瓟?shù)組的值.它可以接受任意多個(gè)參數(shù),也就是說(shuō)可以通過(guò)它拼接任意多個(gè)字符串.

var stringValue="hello";
  var result=stringValue.concat("world","!")
  console.log(result);//hellowworld!
  console.log(stringValue);//hello

雖然concat()是專(zhuān)門(mén)用來(lái)拼接字符串的方法,但實(shí)踐中使用更多的還是加號(hào)操作符(+).而且,使用加號(hào)操作符在大多數(shù)情況下都比使用concat()方法要簡(jiǎn)便易行(特別是在拼接多個(gè)字符串的情況下).

ECMAScript還提供了三個(gè)基于子字符串創(chuàng)建新字符串的方法:slice(),substr()和substring().

這三個(gè)方法都會(huì)返回被操作字符串的一個(gè)子字符串,而且也都接受一或兩個(gè)參數(shù).第一個(gè)參數(shù)指定子字符串的開(kāi)始位置,第二個(gè)參數(shù)(在指定的情況下)表示子字符串到哪里結(jié)束.slice()和substring()的第二個(gè)參數(shù)指定的是子字符串最后一個(gè)字符后面的位置.而substr()的第二個(gè)參數(shù)指定的則是返回的字符個(gè)數(shù).如果沒(méi)有給這些方法傳遞第二個(gè)參數(shù),則將字符串的長(zhǎng)度作為結(jié)束位置.與concat()方法一樣,slice(),substr()和substring()也不會(huì)修改字符串本身的值--它們只是返回一個(gè)基本類(lèi)型的字符串值,對(duì)原始字符串沒(méi)有任何影響.

var stringValue="hello world";
  console.log(stringValue.slice(3));//lo world
  console.log(stringValue.substring(3));//lo world
  console.log(stringValue.substr(3));//lo world
  console.log(stringValue.slice(3,7));//lo w
  console.log(stringValue.substring(3,7));//lo w
  console.log(stringValue.substr(3,7));//lo worl

substr()返回"lo worl”,因?yàn)樗牡诙€(gè)參數(shù)指定的是要返回的字符個(gè)數(shù).

在傳遞給這些方法的參數(shù)是負(fù)值的情況下,slice()方法會(huì)將傳入的負(fù)值與字符串的長(zhǎng)度相加,substr()方法將負(fù)的第一個(gè)參數(shù)加上字符串的長(zhǎng)度,而將負(fù)的第二個(gè)參數(shù)轉(zhuǎn)換為0.最后,substring()方法會(huì)把所有負(fù)值參數(shù)都轉(zhuǎn)換為0.

var stringValue="hello world";
  console.log(stringValue.slice(-3));//rld
  console.log(stringValue.substring(-3));//hello world
  console.log(stringValue.substr(-3));//rld
  console.log(stringValue.slice(3,-4));//lo w
  console.log(stringValue.substring(3,-4));//hel
  console.log(stringValue.substr(3,-4));//(空字符串)

注意:IE的JavaScript實(shí)現(xiàn)在處理向substr()方法傳遞負(fù)值的情況時(shí)存在問(wèn)題,它會(huì)返回原始的字符串.IE9修復(fù)了這個(gè)問(wèn)題.

當(dāng)?shù)诙€(gè)參數(shù)是負(fù)值時(shí),三個(gè)方法的行為各不相同.slice()方法會(huì)把第二個(gè)參數(shù)轉(zhuǎn)換成7,substring()方法會(huì)把第二個(gè)參數(shù)轉(zhuǎn)換為0,而由于這個(gè)方法會(huì)將小的數(shù)作為開(kāi)始位置,將較大的數(shù)作為結(jié)束位置.substr()也會(huì)將第二個(gè)參數(shù)轉(zhuǎn)換成0,也就意味著返回包含零個(gè)字符的字符串,也就是一個(gè)空字符串.

3.字符串位置方法

有兩個(gè)可以從字符串中查找子字符串的方法:indexOf()和lastIndexOf().這兩個(gè)方法都是從一個(gè)字符串中搜索給定的子字符串,然后返子字符串的位置(如果沒(méi)有找到該字符串,則返回-1).

indexOf()方法從字符串的開(kāi)頭向后搜索子字符串,而lastIndexOf()方法是從字符串的末尾向前搜索子字符串.

var stringValue="hello world";
  console.log(stringValue.indexOf("o"));//4
  console.log(stringValue.lastIndexOf("o"));//7

如果"o”在這個(gè)字符串中僅出現(xiàn)一次,那么indexOf()和lastIndexOf()會(huì)返回相同的位置值.

這兩個(gè)方法都可以接收可選的第二個(gè)參數(shù),表示從字符串中的哪個(gè)位置開(kāi)始搜索.換句話(huà)說(shuō),indexOf()會(huì)從該參數(shù)指定的位置向后搜索,忽略該位置之前的所有字符;而lastIndexOf()則會(huì)從指定的的位置向前搜索,忽略該位置之后的所有字符.

var stringValue="hello world";
  console.log(stringValue.indexOf("o"),6);//4 6
  console.log(stringValue.indexOf("o",6));//7
  console.log(stringValue.lastIndexOf("o",6));//4
var stringValue="Lorem ipsum dolor sit amet, consectetur adipisicing elit";
  var positions=new Array();
  var pos=stringValue.indexOf("e");
  while(pos>-1){
    positions.push(pos);
    pos=stringValue.indexOf("e",pos+1);
  }
  console.log(positions);//[3,24,32,35,52]

這個(gè)例子通過(guò)不斷增加indexOf()方法開(kāi)始查找的位置,遍歷了一個(gè)長(zhǎng)字符串.在循環(huán)之外,首先找到了"e"在字符串中的初始位置,而進(jìn)入循環(huán)后,則每次都給indexOf()傳遞上一次的位置加1.這樣,就確保了每次搜索都從上一次找到的子字符串的后面開(kāi)始.每次搜索返回的位置依次被保存在數(shù)組positions中,以便將來(lái)使用.

4.trim()方法

ECMAScript 5為所有字符串定義了trim()方法.這個(gè)方法會(huì)創(chuàng)建一個(gè)字符串的副本,刪除前置及后綴的所有空格,然后返回結(jié)果.

var stringValue="  hello world  ";
  var trimmedStringValue=stringValue.trim();
  console.log(stringValue);//  hello world  
  console.log(trimmedStringValue);//hello world

由于trim()返回的是字符串的副本,所以原始字符串中的前置及后綴空格會(huì)保持不變.支持這個(gè)方法的瀏覽器有IE9+,FF3.5+,Safari5+,Opera 10.5+和Chrome.此外,FF3.5+,Safari 5+和Chrome 8+還支持非標(biāo)準(zhǔn)的trimLeft()和trimRight()方法,分別用于刪除字符串開(kāi)頭和末尾的空格.

5.字符串大小寫(xiě)轉(zhuǎn)換方法

ECMAScript中涉及字符串大小寫(xiě)轉(zhuǎn)換的方法有4個(gè):toLowerCase(),toLocaleLowerCase(),toUpperCase()和toLocaleUpperCase().

var stringValue="hello world";
  console.log(stringValue.toLocaleUpperCase());//HELLO WORLD
  console.log(stringValue.toUpperCase());//HELLO WORLD
  console.log(stringValue.toLocaleLowerCase());//hello world
  console.log(stringValue.toLowerCase());//hello world

一般來(lái)說(shuō),在不知道自己的代碼將在哪種語(yǔ)言環(huán)境中運(yùn)行的情況下,還是使用針對(duì)地區(qū)的方法更穩(wěn)妥一些.

6.字符串的模式匹配方法

String類(lèi)型定義了幾個(gè)用于在字符串中匹配模式的方法.第一個(gè)方法就是match(),在字符串上調(diào)用這個(gè)方法,本質(zhì)上與調(diào)用RegExp的exec()方法相同.match()方法只接受一個(gè)參數(shù),要么是一個(gè)正則表達(dá)式,要么是一個(gè)RegExp對(duì)象.

var text="cat,bat,sat,fat";
  var pattern=/.at/;
  //與pattern.exec(text)相同
  var matches=text.match(pattern);
  console.log(matches.index);//0
  console.log(matches[0]);//cat
  console.log(pattern.lastIndex);//0

本例中的match()方法返回了一個(gè)數(shù)組;如果是調(diào)用RegExp對(duì)象的exec()方法并傳遞本例中的字符串作為參數(shù),那么也會(huì)得到與此相同的數(shù)組:數(shù)組的第一項(xiàng)是與整個(gè)模式匹配的字符串,之后的每一項(xiàng)(如果有)保存著與正則表達(dá)式中的捕獲組匹配的字符串.

另一個(gè)用于查找模式的方法是search().這個(gè)方法的唯一參數(shù)與match()方法的參數(shù)相同:由字符串或RegExp對(duì)象指定的一個(gè)正則表達(dá)式.search()方法返回字符串中第一個(gè)匹配項(xiàng)的索引;如果沒(méi)有找到匹配項(xiàng),則返回-1.而且,search()方法始終是從字符串開(kāi)頭向后查找模式.

var text="cat,bat,sat,fat";
  var pos=text.search(/at/);
  console.log(pos);//1

為了簡(jiǎn)化替換子字符串的操作,ECMAScript提供了replace()方法.這個(gè)方法接受兩個(gè)參數(shù):第一個(gè)參數(shù)可以是一個(gè)RegExp對(duì)象或者一個(gè)字符串(這個(gè)字符串不會(huì)被轉(zhuǎn)換成正則表達(dá)式),第二個(gè)參數(shù)可以是一個(gè)字符串或者一個(gè)函數(shù).如果第一個(gè)參數(shù)是字符串,那么只會(huì)替換第一個(gè)子字符串.要想替換所有子字符串,唯一的辦法就是提供一個(gè)正則表達(dá)式,而且要指定全局(g)標(biāo)志.

var text="cat,bat,sat,fat";
  var result=text.replace("at","ond");
  console.log(result);//cond,bat,sat,fat
  result=text.replace(/at/g,"ond");//cond,bond,sond,fond

后面是通過(guò)將第一個(gè)參數(shù)修改為帶有全局標(biāo)志的正則表達(dá)式,就將全部"at"都替換成了"ond".

如果第二個(gè)參數(shù)是字符串,那么還可以使用一些特殊的字符序列,將正則表達(dá)式操作得到的值插入到結(jié)果字符串中.

下面列出了ECMAScript提供的這些特殊的字符序列.

字符序列 替換文本
$$ $
$& 匹配整個(gè)模式的子字符串.與RegExp.lastMatch的值相同
$' 匹配的子字符串之前的子字符串.與RegExp.leftContext的值相同
$` 匹配的子字符串之后的子字符串.與RegExp.rightContext的值相同
$n 匹配第n個(gè)捕獲組的子字符串,其中n等于0~9.例如,$1是匹配第一個(gè)捕獲組的子字符串,$2是匹配第二個(gè)捕獲組的子字符串.以此類(lèi)推.如果正則表達(dá)式中沒(méi)有定義捕獲組,則使用空字符串
$nn 匹配第nn個(gè)捕獲組的子字符串,其中nn等于01~99.例如,$01是匹配第一個(gè)捕獲組的子字符串,$02是匹配第二個(gè)捕獲組的子字符串,以此類(lèi)推.如果正則表達(dá)式中沒(méi)有定義捕獲組,則使用空字符串

通過(guò)這些特殊的字符序列,可以使用最近一次匹配結(jié)果中的內(nèi)容.

var text="cat,bat,sat,fat";
  result=text.replace(/(.at)/g,"word ($1)");
  console.log(result);//word(cat),word(bat),word(sat),word(fat)

在此,每個(gè)以".at”結(jié)尾的單詞都被替換了,替換結(jié)果是"word"后跟一對(duì)圓括號(hào),而圓括號(hào)中是被字符序列$1所替換的單詞.

replace()方法的第二個(gè)參數(shù)也可以是一個(gè)函數(shù).在只有一個(gè)匹配項(xiàng)(即與模式匹配的字符串)的情況下,會(huì)向這個(gè)函數(shù)傳遞3個(gè)函數(shù):模式的匹配項(xiàng),模式匹配項(xiàng)在字符串的位置和原始字符串.在正則表達(dá)式中定義了多個(gè)捕獲組的情況下,傳遞給函數(shù)的參數(shù) 依次是模式的匹配項(xiàng),第一個(gè)捕獲組的匹配項(xiàng),第二個(gè)捕獲組的匹配項(xiàng)....,但最后兩個(gè)參數(shù)仍然分別是模式的匹配項(xiàng)在字符串中的位置和原始字符串.這個(gè)函數(shù)應(yīng)該返回一個(gè)字符串,表示應(yīng)該被替換的匹配項(xiàng)使用函數(shù)作為replace()方法的第二個(gè)參數(shù)可以實(shí)現(xiàn)更加精細(xì)的替換操作.

function htmlEscape(text){
    return text.replace(/[<>"&]/g,function(match,pos,originalText){
      switch(match){
        case "<":
          return "&lt;";
        case ">":
          return "&gt;";
        case "&":
          return "&amp;";
        case "\"":
          return "&quot;";
      }
    });
  }
  console.log(htmlEscape("<p class=\"greeting\">Hello world!</p>*"));//&lt;p class=&quot;greeting&quot;&gt;Hello world!&lt;/p&gt;*

這里,我們?yōu)椴迦際TML代碼定義了函數(shù)htmlEscape(),這個(gè)函數(shù)能夠轉(zhuǎn)義4個(gè)字符:小于號(hào),大于號(hào),和號(hào)以及雙引號(hào).實(shí)現(xiàn)這種轉(zhuǎn)義的最簡(jiǎn)單方式,就是使用正則表達(dá)式查找這幾個(gè)字符,然后定義一個(gè)能夠針對(duì)每個(gè)匹配的字符返回特定HTML實(shí)例的函數(shù).

最后一個(gè)與模式匹配有關(guān)的方法是split(),這個(gè)方法可以基于指定的分隔符將一個(gè)字符串分割成多個(gè)子字符串,并將結(jié)果放在一個(gè)數(shù)組中.分隔符可以是字符串,也可以是一個(gè)RegExp對(duì)象(這個(gè)方法不會(huì)將字符串看成正則表達(dá)式).split()方法可以接受可選的第二個(gè)參數(shù),用于指定數(shù)組的大小,以便確保返回的數(shù)組不會(huì)超過(guò)既定大小.

var colorText="red,blue,green,yellow";
  var color1=colorText.split(",");
  console.log(color1);//["red", "blue", "green", "yellow"]
  var color2=colorText.split(",",2);
  console.log(color2);//["red", "blue"]
  var color3=colorText.split(/[^\,]+/);
  console.log(color3);//["", ",", ",", ",", ""]

在最后一次調(diào)用split()返回的數(shù)組中,第一項(xiàng)和最后一項(xiàng)是兩個(gè)空字符串.之所以會(huì)這樣,是因?yàn)橥ㄟ^(guò)正則表達(dá)式指定的分隔符出現(xiàn)在了字符串的開(kāi)頭(即子字符串"red")和末尾(即子字符串"yellow").

對(duì)split()中正則表達(dá)式的支持因?yàn)g覽器而異.盡管對(duì)于簡(jiǎn)單的模式?jīng)]有什么差別,但對(duì)于未發(fā)現(xiàn)匹配項(xiàng)以及帶有捕獲組的模式,匹配的行為就不大相同了.以下是幾種覺(jué)的差別.

IE8及之前的版本會(huì)忽略捕獲組.IE9能正確地在結(jié)果中包含捕獲組.

FF3.6及之前版本在捕獲組未找到匹配項(xiàng)時(shí),會(huì)在結(jié)果數(shù)組中包含空字符串;ECMA-262規(guī)定沒(méi)有匹配項(xiàng)的捕獲組在結(jié)果數(shù)組中應(yīng)該用undefined表示.

在正則表達(dá)式中使用捕獲組時(shí)還有其他微妙的差別.

7.localeCompare()方法

這個(gè)方法比較兩個(gè)字符串,并返回下列值中的一個(gè):

如果字符串在字母表中應(yīng)該排在字符串參數(shù)之前,則返回一個(gè)負(fù)數(shù)(大多數(shù)情況下是-1,具體的值要視實(shí)現(xiàn)而定)

如果字符串等于字符串參數(shù),則返回0.

如果字符串在字母表中應(yīng)該排在字符串參數(shù)之后,則返回一個(gè)正數(shù)(大多數(shù)情況下是1,具體的值同樣要視實(shí)現(xiàn)而定)

var stringValue="yellow";
  console.log(stringValue.localeCompare("brick"));//1
  console.log(stringValue.localeCompare("yellow"));//0
  console.log(stringValue.localeCompare("zoo"));//-1

因?yàn)閘ocaleCompare()返回的數(shù)值取決于實(shí)現(xiàn),所以最好是像下面例子所示的這樣使用這個(gè)方法.

function determineOrder(value){
    var result=stringValue.localeCompare(value);
    if(result<0){
      console.log("The string 'yellow' comes before the string '"+value+"'.");
    }else if(result>0){
      console.log("The string 'yellow' comes after the string '"+value+ "'.");
    }else{
      console.log("The string 'yellow' is equal to the string '"+value+"'.");
    }
  }
  determineOrder("brick");
  determineOrder("yellow");
  determineOrder("zoo");

8.fromCharCode()方法

另外,String構(gòu)造函數(shù)還有一個(gè)靜態(tài)方法:fromCharCode().這個(gè)方法的任務(wù)是接收一或多個(gè)字符編碼,然后將它們轉(zhuǎn)換成一個(gè)字符串.從本質(zhì)上來(lái)看,這個(gè)方法與實(shí)例方法charCodeAt()執(zhí)行的是相反的操作.

以上內(nèi)容是小編給大家介紹的關(guān)于JavaScript高級(jí)教程5.6之基本包裝類(lèi)型(詳細(xì)),希望大家喜歡。

相關(guān)文章

最新評(píng)論