們知道最簡潔的數字轉字串方法是:
強制類型轉換
整數要轉換成字串,必須使用Integer.toString()靜態方法或者String.valueOf()靜態方法,把字串轉換為整數,必須使用Integer.valueOf()。
可見,不能把JavaScript中的類型轉換看作為“強制類型轉換”。
還可使用強制類型轉換(type casting)處理轉換值的類型。使用強制類型轉換可以訪問特定的值,即使它是另一種類型的。
ECMAScript中可用的3種強制類型轉換如下:
Boolean(value)——把給定的值轉換成Boolean型;
Number(value)——把給定的值轉換成數字(可以是整數或浮點數);
String(value)——把給定的值轉換成字串。
用這三個函數之一轉換值,將建立一個新值,存放由原始值直接轉換成的值。這會造成意想不到的後果。
當要轉換的值是至少有一個字元的字串、非0數字或對象(下一節將討論這一點)時,Boolean()函數將返回true。如果該值是Null 字元串、數字0、undefined或null,它將返回false。
可以用下面的程式碼片段測試Boolean型的強制類型轉換。
代碼如下 |
複製代碼 |
Boolean(""); //false – empty string Boolean("hi"); //true – non-empty string Boolean(100); //true – non-zero number Boolean(null); //false - null Boolean(0); //false - zero Boolean(new Object()); //true – object |
Number()的強制類型轉換與parseInt()和parseFloat()方法的處理方式相似,只是它轉換的是整個值,而不是部分值。還記得嗎,parseInt()和parseFloat()方法只轉換第一個無效字元之前的字串,因此 "4.5.6 "將被轉換為 "4.5 "。用Number()進行強制類型轉換, "4.5.6 "將返回NaN,因為整個字串值不能轉換成數字。如果字串值能被完整地轉換,Number()將判斷是調用parseInt()方法還是調用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 Object()) NaN
Number(100) 100
代碼如下:
代碼如下 |
複製代碼 |
<div style="background-color:#FFCC99; width:400px; margin:0px; padding:5px"> <script language="javascript" type="text/javascript"> function checkForm(){ var age2; age2 = Number(document.frmTest.age.value) + 1; document.frmTest.age2.value = age2; /* var salesforce_para; salesforce_para = "name=" + document.frmTest.name.value; salesforce_para += "&" + "age=" + document.frmTest.age.value; var targetUrl = "test_js.php?" + salesforce_para; window.location = targetUrl; */ } </script> <form action="test_js.php" method="post" name="frmTest"> <!--姓名:<input type="text" name="name"><br />--> 年齡:<input type="text" name="age"><br /> <input type="button" name="submit" value="提交->>查看虛歲" onClick="checkForm()"><br /> 虛歲:<input type="text" name="age2"> </form> </div> |
字串只能進行加法(拼接)
字串進行加法(拼接)是很常見的,但是字串進行減法、乘法、除法呢?
這似乎很難定義,實際上字串沒有減法、乘法、除法操作。
但Javascript是動態語言,如果你拿兩個字串進行這三種操作的時候,他會嘗試將其轉成數字再進行相應的操作。例如:
代碼如下 |
複製代碼 |
alert("45" - "32"); //13alert("5" * "6"); //30alert("12" / "3"); //4 |
但這種轉換操作和parseInt和parseFloat不太像,而和Number比較像,比如:
代碼如下 |
複製代碼 |
alert("123a" - "2bc"); //NaN alert(parseInt("123a") - parseInt("2bc")); //121 alert(Number("123a") - Number("2bc")); |
//NaN也就是說,這種轉換和Number一樣,會將非純數字型字串轉成NaN,表示其是非數字。
而parseInt、parseFloat則會取出字串中取出前面的能表示成數位部分,而忽略掉後面不能表示成數位部分。
最簡潔的字串轉數字方法
藉助字串在進行其不能進行的運算時會先嘗試轉成數字這個特性。我們可以對字串前加上正符號來將字串轉成數字。如:
代碼如下 |
複製代碼 |
var num = +"45"; alert(typeof num); //numberjQuery中有一個這個方法的應用,比如我們得到一個字串怎麼判斷他是不是只有數字呢?jQuery的方法: var string = "321"; //這個事得到的字串,隨意是什麼 alert(+string + "" === string); //true表示是數字字串,否則不是 其實利用這個特性還有其他方法,比如: var num = "45" - 0; alert(typeof num); //numbervar num = "45" * 1; alert(typeof num); //numbervar num = "45" / 1; alert(typeof num); //number |
例如,如果要把字串 "1234blue "轉換成整數,那麼parseInt()將返回1234,因為當它檢測到字元b時,就會停止檢測過程。字串中包含的數字字面量會被正確轉換為數字,因此字串 "0xA "會被正確轉換為數字10。不過,字串 "22.5 "將被轉換成22,因為對於整數來說,小數點是無效字元。一些樣本如下:
代碼如下 |
複製代碼 |
parseInt("1234blue"); //returns 1234 parseInt("0xA"); //returns 10 parseInt("22.5"); //returns 22 parseInt("blue"); //returns NaN |
parseInt()方法還有基模式,可以把二進位、八進位、十六進位或其他任何進位的字串轉換成整數。基是由parseInt()方法的第二個參數指定的,所以要解析十六進位的值,需如下調用parseInt()方法:
代碼如下 |
複製代碼 |
parseInt("AF", 16); //returns 175
|
當然,對二進位、八進位,甚至十進位(預設模式),都可以這樣調用parseInt()方法:
代碼如下 |
複製代碼 |
parseInt("10", 2); //returns 2 parseInt("10", 8); //returns 8 parseInt("10", 10); //returns 10
|
如果十進位數包含前置0,那麼最好採用基數10,這樣才不會意外地得到八進位的值。例如:
代碼如下 |
複製代碼 |
parseInt("010"); //returns 8 parseInt("010", 8); //returns 8 parseInt("010", 10); //returns 10
|
在這段代碼中,兩行代碼都把字串 "010 "解析成了一個數字。第一行代碼把這個字串看作八進位的值,解析它的方式與第二行代碼(聲明基數為8)相同。最後一行代碼聲明基數為10,所以iNum3最後等於10。
進位問題
0x開頭的是16進位,所以Number和parseInt都會對16進位進行相應的轉換,字串的自動轉換也是這般:
代碼如下 |
複製代碼 |
alert(parseInt("0x10")); //16 alert(Number("0x10")); //16 alert(+"0x10"); |
//16不過parseFloat有些鬧彆扭,他不認識16進位,結果變成這樣:
alert(parseFloat("0x10")); //0更悲劇的是0開頭的,我們知道0開頭可以用來表示8進位,在Number和字串自動轉換中,0開頭會當成十進位來擷取,如:
代碼如下 |
複製代碼 |
alert(Number("010")); //10 alert(+"010"); //10而parseInt中卻很悲催,ECMAScript中並未對此進行強制規定所以出現了下面的情況: alert(parseInt("010")); //8 in Firefox & IEalert(parseInt("010")); |
//10 in Chrome?(?_?)? 難怪很少見到Javascript中用到8進位,如果要確保8進位只能使用parseInt的第二個參數了:
代碼如下 |
複製代碼 |
alert(parseInt("010", 8)); //8parseFloat繼續不認識8進位,所以: alert(parseFloat("010")); //10 |