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