们知道最简洁的数字转字符串方法是:
强制类型转换
整数要转换成字符串,必须使用Integer.toString()静态方法或者String.valueOf()静态方法,把字符串转换为整数,必须使用Integer.valueOf()。
可见,不能把JavaScript中的类型转换看作为“强制类型转换”。
还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字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
|
|