為了便于操作基本類型值,ECMAScript還提供了3個(gè)特殊的引用類型:Boolean、Number和String。這些類犁與前面介紹的其他引用類型相似,但同時(shí)也具有與各自的基本類型相應(yīng)的特殊行為。實(shí)際上,每當(dāng)讀取一個(gè)基本類型值的時(shí)候,后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型的對(duì)象,從而讓我們能夠調(diào)用一些方法來操作這些數(shù)據(jù)。來看下面的例子:
var sl="some text";
var s2=sl.substring(2);
這個(gè)例子中的變量sl包含一個(gè)字符串,字符串當(dāng)然是基本類型值。而下一行調(diào)用了sl的substring()方法,并將返回的結(jié)果保存在了s2中。我們知道,基本類型值不是對(duì)象,因而從邏輯上講它們不應(yīng)該有方法(盡管如我們所愿,它們確實(shí)有方法)。其實(shí),為了讓我們實(shí)現(xiàn)這種直觀的操作,后臺(tái)已經(jīng)自動(dòng)完成了一系列的處理。當(dāng)?shù)诙写a訪問sl時(shí),訪問過程處于一種讀取模式,也就是要從內(nèi)存中讀取這個(gè)字符串的值。而在讀取模式中訪問字符串時(shí),后臺(tái)都會(huì)自動(dòng)完成下列處理:
(1)創(chuàng)建String類型的一個(gè)實(shí)例;
(2)在實(shí)例上調(diào)用指定的方法;
(3)銷毀這個(gè)實(shí)例。
可以將以上三個(gè)步驟想象成是執(zhí)行了下列ECMAScript代碼:
var sl=new String("some text");
var s2=s1.substring(2);
sl=null;
經(jīng)過此番處理,基本的字符串值就變得跟對(duì)象一樣了。而且,上面這三個(gè)步驟也分別適用于Boolean和Number類型對(duì)應(yīng)的布爾值和數(shù)字值。
引用類型與基本包裝類型的主要區(qū)別就是對(duì)象的生存期。使用new操作符創(chuàng)建的引用類型的實(shí)例,在執(zhí)行流離開當(dāng)前作用域之前都一直保存在內(nèi)存中。而自動(dòng)創(chuàng)建的基本包裝類型的對(duì)象,則只存在于一行代碼的執(zhí)行瞬間,然后立即被銷毀。這意味著我們不能在運(yùn)行時(shí)為基本類型值添加屬性和方法。來看下面的例子:
var sl="some text":
sl.color="red";
alert (sl.color); //undefined
在此,第二行代碼試圖為字符串sl添加一個(gè)color屬性。但是,當(dāng)?shù)谌写a再次訪問sl時(shí),其color屬性不見了。問題的原因就是第二行創(chuàng)建的String對(duì)象在執(zhí)行第三行代碼時(shí)已經(jīng)被銷毀了。第三行代碼又創(chuàng)建自己的String對(duì)象,而該對(duì)象沒有color屬性。
當(dāng)然,可以顯武地調(diào)用Boolean、Number和String來創(chuàng)建基本包裝類型的對(duì)象。不過,南昌網(wǎng)站建設(shè)公司技術(shù)員認(rèn)為應(yīng)該在絕對(duì)必要的情況下再這樣做,因?yàn)檫@種做法很容易讓人分不清自己是在處理基本類型還是引用類型的值。對(duì)基本包裝類型的實(shí)例調(diào)用typeof會(huì)返回"object",而且所有基本包裝類型的對(duì)象都會(huì)被轉(zhuǎn)換為布爾值true。
盡管我們不建議顯式地創(chuàng)建基本包裝類型的對(duì)象,但它們操作基本類型值的能力還是相當(dāng)重要的。而每個(gè)基本包裝類型都提供了操作相應(yīng)值的便捷方法。
希望對(duì)廣大站長(zhǎng)或網(wǎng)站建設(shè)公司或從事企業(yè)網(wǎng)站建設(shè)的團(tuán)隊(duì)有所幫助,如對(duì)此不太理解的,可以與南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高與廣大站長(zhǎng)和網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗(yàn)。