java 强制声明为引用_JAVASERIPT高级程序设计35~45页
ECMA-262中定義的最特殊的類型是Number型。這種類型既可以表示32
位的整數(shù),還可以表示64位的浮點數(shù)。直接輸入的(而不是從另一個變量訪問 的)任何數(shù)字都被看作Number型的字面量。例如,下面的代碼聲明了存放整數(shù) 值的變量,它的值由字面量55定義:
var 1NUE1 = 55;
整數(shù)也可以被表示為八進(jìn)制(以8為底)或十六進(jìn)制(以16為底)的字面量。 八進(jìn)制字面量的首數(shù)字必須是0,其后的數(shù)字可以是任何八進(jìn)制數(shù)字(0到7), 如下面代碼所示:
var iNum = 070; //G70 is?equal to 56 in decimal
要創(chuàng)建十六進(jìn)制的字面量,首位數(shù)字必須為0,其后接字母X,然后是任意的十 六進(jìn)制數(shù)字(0到9和A到F)。這些字母可以是大寫的,也可以是小寫的。例 如:
var //Oxlf is equal to 31 in decimal
uar = OxAB; //OxAB is?to 171 in d-eciinaL
盡管所有整數(shù)都可表示為八進(jìn)制或十六進(jìn)制的字面量,但所有數(shù)學(xué)運算返回的都是 十進(jìn)制結(jié)果。
要定義浮點值,必須包括小數(shù)點和小數(shù)點后的一位數(shù)字(例如,用1.0而不是1) 這被看作浮點數(shù)字面量。例如:
var f況皿=5 a 0;
浮點字面量的有趣之處在于,用它進(jìn)行計算前,真正存儲的是字符串。
對于非常大或非常小的數(shù),可以用科學(xué)記數(shù)法表示浮點值。采用科學(xué)記數(shù)法, 可以把一個數(shù)表示為數(shù)字(包括十進(jìn)制數(shù)字)加e(或E),后面加乘以10的 倍數(shù)。不明白?下面是一個示例:
var fNum 二 3
該符號表示的是數(shù)31250000。把科學(xué)記數(shù)法轉(zhuǎn)化成計算式就可以得到該值:3.125X10',即等于3.125X 10X10X10X10X10X10X10。
也可用科學(xué)記數(shù)法表示非常小的數(shù),例如0.00000000000000003可以表示為
3-e17(這里,10被升到-17次幕,意味著需要被10除17次)。ECMAScript默認(rèn)把具有6個或6個以上前導(dǎo)0的浮點數(shù)轉(zhuǎn)換成科學(xué)記數(shù)法。
也可用64位IEEE 754形式存儲浮點值,這意味著十進(jìn)制值最多可以有17
個十進(jìn)制位。17位之后的值將被截去,從而造成一些小的數(shù)學(xué)誤差。
幾個特殊值也被定義為Number類型的。前兩個是Number. MAX_VALUE和Number. MIN_ VALUE,它們定義了Number值集合的外邊界。所有ECMAScript數(shù)都必須在這兩 個值之間。不過計算生成的數(shù)值結(jié)果可以不落在這兩個數(shù)之間。
當(dāng)計算生成的數(shù)大于Number. MAX_VALUE時,它將被賦予值Number. POSITIVE_INFINITY,意味著不再有數(shù)字值。同樣,生成的數(shù)值小于Number.MIN_VALUE的計算也會被賦予 值Number. NEGATIVE_INFINITY,也意味著不再有數(shù)字值。如果計算返回的是無窮大值, 那么生成的結(jié)果不能再用于其他計算。
事實上,有專門的值表示無窮大,(如你所猜測的)即Infinity?Number. POSITIVE_INFINITY 的值為 Infinity, Number. NEGATIVE_INFINITY 的值為-Infinity。
由于無窮大數(shù)可以是正數(shù)也可以是負(fù)數(shù),所以可用一個方法判斷一個數(shù)是否 是有窮的(而不是單獨測試每個無窮數(shù))。可以對任何數(shù)調(diào)用isFinit()方法, 以確保該數(shù)不是無窮大。例如:
var i Re suit = s ocw_r es 1 Ly-larg e_nxnnber i
if (isFinite(iResult J)(
alert (*Numher is f initea ** I j
} else (
alertis infinite. ■ J ;
最后一個特殊值是NaN,表示非數(shù)(Not a Number)。NaN是個奇怪的特殊值。 一般說來,這種情況發(fā)生在類型(String、Boolean等)轉(zhuǎn)換失敗時。例如,要 把單詞blue轉(zhuǎn)換成數(shù)值就會失敗,因為沒有與之等價的數(shù)值。與無窮大值一樣,
NaN也不能用于算術(shù)計算。NaN的另一個奇特之處在于,它與自身不相等,這意味 著下面的代碼將返回false:
alert== N舔); outputs
出于這種原因,不推薦使用NaN值本身。函數(shù)isNaN ()會做得相當(dāng)好:
alert(isNaM('blus"}); //outputs "true*
alert *123; //outputs * false"
2.6.6 String 類型
String類型的獨特之處在于,它是唯一沒有固定大小的原始類型。可以用字符 串存儲0或更多的Unicode字符,由16位整數(shù)表示(Unicode是一種國際字符 集,本書后面將討論它)。
字符串中每個字符都有特定的位置,首字符從位置0開始,第二個字符在
位置1,依此類推。這意味著字符串中的最后一個字符的位置一定是字符串的長 度減1 (如圖2-2所示)。
寇個字符串的住度足占
恒J " I U I;丨門
0 12 3 4 5
圈癩
字符串字面量是由雙引號(“)或單引號(~)聲明的。與Java不同的是,雙引 號用于聲明字符串,單引號用于聲明字符。但是,由于ECMAScript沒有字符類 型,所以可使用這兩種表示法中的任何一種。例如,下面的兩行代碼都有效:
var sColorl = ■blueh;
VAr flCdl*r,2 = 'bluft1;
String類型還包括幾種字符字面量,Java、C和Perl的開發(fā)者應(yīng)該對此非常熟 悉。下表列出了ECMAScript的字符字面量:
字面量 含義
\n
\t
\b
\u
\I
\\
\a
?"
\0nnn \xnn \unnnn
換行
制表符
空格
回車
換頁符
反斜杠
單引號
雙引號
八進(jìn)制代碼nnn (q是0到7中的一個八進(jìn)制數(shù)字)表示的字符
十六進(jìn)制代碼nn (n是0到F中的一個十六進(jìn)制數(shù)字)表示的字符
十六進(jìn)制代碼nnnn (n是0到F中的一個十六進(jìn)制數(shù)字)表示的Unicode字符
第2章ECMAScript基礎(chǔ)
2.7轉(zhuǎn)換
所有程序設(shè)計語言最重要的特征之一是具有進(jìn)行類型轉(zhuǎn)換的能力,ECMAScript給開 發(fā)者提供了大量簡單的轉(zhuǎn)換方法。大多數(shù)類型具有進(jìn)行簡單轉(zhuǎn)換的方法,還有幾個 全局方法可以用于更復(fù)雜的轉(zhuǎn)換。無論哪種情況,在ECMAScript中,類型轉(zhuǎn)換都是 簡短的一步操作。
2.7.1轉(zhuǎn)換成字符串
ECMAScript的Boolean值、數(shù)字和字符串的原始值的有趣之處在于它們是偽對 象,這意味著它們實際上具有屬性和方法。例如,要獲得字符串的長度,可以采 用下面的代碼:
v^r sColor ■■ "blue1*:
alert I:sColor, length) ; //outputs
盡管"blue”是原始類型的字符串,它仍然具有屬性length,用于存放該字符串的大 小。總而言之,3種主要的原始值Boolean值、數(shù)字和字符串都有toStringO方法, 可以把它們的值轉(zhuǎn)換成字符串o
也許你會問,“字符串還有toString ()方法,這不是多余的嗎? ”是的,的確如 此,不過ECMAScript定義所有對象都有toString()方法,無論它是偽對象,還是 真的對象。因為String類型屬于偽對象,所以它一定有toString()方法。
Boolean型的toString()方法只是輸出"true”或"false”,結(jié)果由變量的值決定:
var IpFccdud ■ falser
alert IbFoun,^. toStringt j I ;
Number類型的toString()方法比較特殊,它有兩種模式,即默認(rèn)模式和基模式。
采用默認(rèn)模式,toString()方法只是用相應(yīng)的字符串輸出數(shù)字值(無論是整數(shù)、浮
var iNunl = 10;
var £Nliki2?= 1-0u0;
aL&rt Li^uml.toString[)I;
alert[toString[)1;
在默認(rèn)模式中,無論最初采用什么表示法聲明數(shù)字,Number類型的toString()方 法返回的都是數(shù)字的十進(jìn)制表示。因此,以八進(jìn)制或十六進(jìn)制字面量形式聲明的 數(shù)字輸出時都是十進(jìn)制形式的。
采用Number類型的toString()方法的基模式,可以用不同的基輸出數(shù)字,例如二 進(jìn)制的基是2,八進(jìn)制的基是8,十六進(jìn)制的基是16。基只是要轉(zhuǎn)換成的基數(shù)的 另一種叫法而已,它是toString()方法的參數(shù):
var iNuun = 10;
file-rt liNuiftl. toStrlngi2)) ? //outputs "1010*
aL&rtliNuml.toString^B)); //outputs
alert ; //outputs W
在前面的示例中,以3種不同的形式輸出了數(shù)字10,即二進(jìn)制形式、八進(jìn)
制形式和十六進(jìn)制形式。HTML采用十六進(jìn)制數(shù)表示每種顏色,在HTML中處理數(shù) 字時這種功能非常有用。
對數(shù)字調(diào)用toString(lO)與調(diào)用toString()相同,它們返回的都是該數(shù)字的十進(jìn)制 形式。
2.7.2轉(zhuǎn)換成數(shù)字
ECMAScript提供了兩種把非數(shù)字的原始值轉(zhuǎn)換成數(shù)字的方法,即parselnt()和parseFloat()o正如你可能想到的,前者把值轉(zhuǎn)換成整數(shù),后者把值轉(zhuǎn)換成浮點數(shù)。
只有對String類型調(diào)用這些方法,它們才能正確運行;對其他類型返回的都是
NaNo
在判斷字符串是否是數(shù)字值前,parselnt()和parseFloat()都會仔細(xì)分析該字符串。parselnt ()方法首先查看位置0處的字符,判斷它是否是個有效數(shù)字;如果不是, 該方法將返回NaN,不再繼續(xù)執(zhí)行其他操作。但如果該字符是有效數(shù)字,該方法 將查看位置1處的字符,進(jìn)行同樣的測試。這一過程將持續(xù)到發(fā)現(xiàn)非有效數(shù)字的 字符為止,此時parselnt()將把該字符之前的字符串轉(zhuǎn)換成數(shù)字。例如,如果要 把字符串"1234blue”轉(zhuǎn)換成整數(shù),那么parselnt()將返回1234,因為當(dāng)它檢測到字符b時,就會停止檢測過程。字符串中包含的數(shù)字字面量會被正確轉(zhuǎn)換為數(shù)字,因 此字符串"OxA〃會被正確轉(zhuǎn)換為數(shù)字10o不過,字符串〃22.5〃將被轉(zhuǎn)換成22,因為 對于整數(shù)來說,小數(shù)點是無效字符。一些示例如下:
var iNutnl = parselnt{"1234blue") ; //returns 1234
var = parselnt (; //returns 10
var 言 parselnt I b22.5fc?H / /retuiziE 22
var - parselnt("blue"); //returns NaN
parselnt()方法還有基模式,可以把二進(jìn)制、八進(jìn)制、十六進(jìn)制或其他任何進(jìn)制的 字符串轉(zhuǎn)換成整數(shù)。基是由parselnt ()方法的第二個參數(shù)指定的,所以要解析十 六進(jìn)制的值,需如下調(diào)用parselnt。方法:
var iNuunl = parselRti ■AF", 捉】; //returns 175
當(dāng)然,對二進(jìn)制、八進(jìn)制,甚至十進(jìn)制(默認(rèn)模式),都可以這樣調(diào)用parselnt。方法:
var iNunl = parselnt("10"^ 2) ? //returns 2
var iNmnS ,= parselnt |1110 **, S] ; / / re turns B
var iNucnS 擋 parseTnc I ■IO*, //returns 10
如果十進(jìn)制數(shù)包含前導(dǎo)0,那么最好采用基數(shù)10,這樣才不會意外地得到八進(jìn)制的值。例如:
var iNuml = parselnt^ p010"): var iNmn2 ? parselnt{"010"^ 83 ? var 蘭 parselntC010". 10);
在這段代碼中,兩行代碼都把字符串〃010〃解析成了一個數(shù)字。第一行代碼
把這個字符串看作八進(jìn)制的值,解析它的方式與第二行代碼(聲明基數(shù)為8)相 同。最后一行代碼聲明基數(shù)為10,所以iNum3最后等于10。
parseFloatO方法與parselnt()方法的處理方式相似,從位置0開始查看每個字符, 直到找到第一個非有效的字符為止,然后把該字符之前的字符串轉(zhuǎn)換成數(shù)字。不 過,對于這個方法來說,第一個出現(xiàn)的小數(shù)點是有效字符。如果有兩個小數(shù)點, 第二個小數(shù)點將被看作無效的,parseFloatO方法會把這個小數(shù)點之前的字符串轉(zhuǎn) 換成數(shù)字。這意味著字符串"22. 34. 5”將被解析成22. 34。
使用parseFloat()方法的另一不同之處在于,字符串必須以十進(jìn)制形式表示浮點 數(shù),而不能用八進(jìn)制形式或十六進(jìn)制形式。該方法會忽略前導(dǎo)0,所以八進(jìn)制數(shù)0908將被解析為908。對于十六進(jìn)制數(shù)OxA,該方法將返回NaN,因為在浮點數(shù)中,x不是有效字符。此外,parseFloatO也沒有基模式。
下面是使用parseFloat()方法的示例:
var 瑙皿 1 ■ par^eFloat ( *123*3blue* ); //returns 1234.0
vsr fldupS = psrseFldflt (;
var = parseFloatO r22.5B};
var fNuni^ = parseFloat (' 22 a?3-4 a?5**);
var 二 par$^FlQat( *0^03-;;
var fN顚$ = parseFloatpbLue■:;
2.7.3強(qiáng)制類型轉(zhuǎn)換
還可使用強(qiáng)制類型轉(zhuǎn)換(typecasting)處理轉(zhuǎn)換值的類型。使用強(qiáng)制類型轉(zhuǎn)換
可以訪問特定的值,即使它是另一種類型的。ECMAScript中可用的3種強(qiáng)制類 型轉(zhuǎn)換如下:
口Boolean(value) 把給定的值轉(zhuǎn)換成Boolean型;
口Number(value) 把給定的值轉(zhuǎn)換成數(shù)字(可以是整數(shù)或浮點數(shù));
口String (value) 把給定的值轉(zhuǎn)換成字符串。
用這三個函數(shù)之一轉(zhuǎn)換值,將創(chuàng)建一個新值,存放由原始值直接轉(zhuǎn)換成的值。這 會造成意想不到的后果。
當(dāng)要轉(zhuǎn)換的值是至少有一個字符的字符串、非0數(shù)字或?qū)ο?下一節(jié)將討論這一 點)時,Boolean0函數(shù)將返回true。如果該值是空字符串、數(shù)字0、undefined或null,它將返回false。可以用下面的代碼段測試Boolean型的強(qiáng)制類型轉(zhuǎn)換。
var bl = Scclean(r")?
var b2 ,= Bcolean;
var = Boolean(100}s
uar = Boolean(null);
var b5 ■ Scol ean 0 H
var bS - Boolean(new Object(H;
Number 0的強(qiáng)制類型轉(zhuǎn)換與parselntO和parseFloat ()方法的處理方式相似,只 是它轉(zhuǎn)換的是整個值,而不是部分值。還記得嗎,parselnt ()和parseFloat ()方法只 轉(zhuǎn)換第一個無效字符之前的字符串,因此"4.5.6”將被轉(zhuǎn)換為"4.5”。用Number()進(jìn) 行強(qiáng)制類型轉(zhuǎn)換,”4.5.6”將返回NaN,因為整個字符串值不能轉(zhuǎn)換成數(shù)字。如果 字符串值能被完整地轉(zhuǎn)換,Number ()將判斷是調(diào)用parselnt ()方法還是調(diào)用parseFloat()方法。下表說明了對不同的值調(diào)用Number()方法會發(fā)生的情況:
用 法
結(jié) 果
Number(false)
0
Number(true)
1
Number(undefined)
NaN
Number(null)
0
Number("5.5")
5.5
Number("56")
56
Number("5.6.7")
NaN
Number(new Obj ect())
NaN
Number(100)
100
最后一種強(qiáng)制類型轉(zhuǎn)換方法String()是最簡單的,因為它可把任何值轉(zhuǎn)換成字符 串。要執(zhí)行這種強(qiáng)制類型轉(zhuǎn)換,只需要調(diào)用作為參數(shù)傳遞進(jìn)來的值的toString。方法,即把1轉(zhuǎn)換成"1",把true轉(zhuǎn)換成"true”,把false轉(zhuǎn)換成"false”,依此 類推。強(qiáng)制轉(zhuǎn)換成字符串和調(diào)用toString()方法的唯一不同之處在于,對null或undefined值強(qiáng)制類型轉(zhuǎn)換可以生成字符串而不引發(fā)錯誤:
var si?= String(null J;
var cNull ■ n^ll?
var t&String 1) ; //won't workr?causes an error
在處理ECMAScript這樣的弱類型語言時,強(qiáng)制類型轉(zhuǎn)換非常有用,不過應(yīng)該確 保使用值的正確。
第2章ECMAScript基礎(chǔ)
2.8引用類型
引用類型通常叫作類(class),也就是說,遇到引用值時,所處理的就是對象。 本書將討論大量的ECMAScript預(yù)定義引用類型。從現(xiàn)在起,將重點討論與已經(jīng) 討論過的原始類型緊密相關(guān)的引用類型。
從傳統(tǒng)意義上來說,ECMAScript并不真正具有類。事實上,除了說明不存在類 在ECMA-262中根本沒有出現(xiàn)“類”這個詞,ECMAScript定義了 “對象定義”, 邏輯上等價于其他程序設(shè)計語言中的類。本書選擇使用術(shù)語“類”,因為大多數(shù) 開發(fā)者對此更熟悉一些。
對象是由new運算符加上要實例化的類的名字創(chuàng)建的,例如,下面代碼創(chuàng)建了Object類的實例:
var o = new Obfect{);
這種語法與Java語言的相似,不過當(dāng)有不止一個參數(shù)時,ECMAScript要求使用 括號。如果沒有參數(shù),如前面代碼所示,括號可以省略:
var o = new Object;
第3章將更深入地探討對象及其行為。這一節(jié)的重點是具有等價的原始類型的引 用類型。
盡管括號不是必需的,但為避免混亂,最好使用括號。
2.8.1 Object類
Object類自身用處不大,不過在了解其他類之前,還是應(yīng)該先了解它。因為ECMAScript中的Object 類與Java中的java. lang, object 相似,ECMAScript中的所 有類都由這個類繼承而來,Object類中的所有屬性和方法都會出現(xiàn)在其他類中, 所以理解了Object類,就可以更好地理解其他類。
Object類具有下列屬性:
口Constructor——對創(chuàng)建對象的函數(shù)的引用(指針)。對于Object類,該指針指向 原始的objectO函數(shù)。
口Prototype 對該對象的對象原型的引用。第3章將進(jìn)一步討論原型。對于所有
的類,它默認(rèn)返回Object對象的一個實例。
Object類還有幾個方法:
口HasOwnProperty(property) 判斷對象是否有某個特定的屬性。必須用字符串指定
該屬性(例如,o.hasOwnProperty("name"))。
口IsPrototypeOf (object) 判斷該對象是否為另一個對象的原型。
口PropertylsEnumerable (property) 判斷給定的屬性是否可以用for…in語句(本章
后面將討論該語句)進(jìn)行枚舉。
口ToString()——返回對象的原始字符串表示。對于Object類,ECMA-262沒有定義 這個值,所以不同的ECMAScript實現(xiàn)具有不同的值。
口ValueOf() 返回最適合該對象的原始值。對于許多類,該方法返回的值都與
toString()的返回值相同。
上面列出的每種屬性和方法都會被其他類覆蓋。
2. 8. 2 Boolean類
Boolean類是Boolean原始類型的引用類型。要創(chuàng)建Boolean對象,只需要傳遞
Boolean值作為參數(shù):
var oBoolean Object 二 new Boolean(true);
Boolean對象將覆蓋object類的valueOf ()方法,返回原始值,即true或false oToStringO 方法也會被覆蓋,返回字符串〃t rue”或"false”。遺憾的是,在ECMAScript中很少 使用Boolean對象,即使使用,也不易理解。
問題通常出現(xiàn)在Boolean表達(dá)式中使用Boolean對象時。例如:
var oFaLseObject = new Boolean[false)j
var ^Result = oFalseObject && true; //outputs true
在這段代碼中,用false值創(chuàng)建Boolean對象。然后用這個值與原始值true進(jìn)行AND操作。在Boolean運算中,false和true進(jìn)彳丁AND操作的結(jié)果是false。不過,在這行代碼中,計算的是oFalseObject,而不是它的值false。正如前面討論過的, 在Boolean表達(dá)式中,所有對象都會被自動轉(zhuǎn)換為true,所以oFalseObejct的值是trueo然后true再與true進(jìn)彳丁AND操作,結(jié)果為true。
雖然你應(yīng)該了解 Boolean 對象的可用性,不過最好還是使用 Boolean 原始值,避免發(fā) 生這一節(jié)提到的問題。
2.8.3 Number類
正如你可能想到的,Number類是Number原始類型的引用類型。要創(chuàng)建Number對象, 采用下列代碼:
var oNunbesObject = new Nystiber CS5);
你應(yīng)該已認(rèn)出本章前面小節(jié)中討論特殊值(如Number. MAX_VALUE)時提到的Number 類。所有特殊值都是Number類的靜態(tài)屬性。
要得到數(shù)字對象的Number原始值,只需要使用valueOf()方法:
var iNucnber = oNmnJ&erObj ec t, va ly eD f {);
當(dāng)然,Number類也有toString()方法,在討論類型轉(zhuǎn)換的小節(jié)中已經(jīng)詳細(xì)討論過該 方法。除從Object類繼承的標(biāo)準(zhǔn)方法外,Number類還有幾個處理數(shù)值的專用方法。
toFixedO方法返回的是具有指定位數(shù)小數(shù)的數(shù)字的字符串表示。例如:
總結(jié)
以上是生活随笔為你收集整理的java 强制声明为引用_JAVASERIPT高级程序设计35~45页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强制卸载mysql关联程序
- 下一篇: 如何在软件里显示编译时间?__DATE_