JavaScrip显式类型转换
尽管JavaScript可以自动做许多类型转换,但有时仍需要做显式转换,或者为了使代码变得清晰易读而做显式转换。
做显式类型转换最简单的方法就是使用Boolean()、Number()、String()或Object()函 数。当不通过new运算符调用这些函数时,它们会作为类型转换函数的规则做类型转换:
Number("3") // => 3
String(false) // => "false"或使用 false.toString()
Boolean([]) // => true
Object(3) // => new Number(3)
需要注意的是,除了null或undefined之外的任何值都具有toString()方法,这个方法的执行结果通常和String()方法的返回结果一致。同样需要注意的是,如果试图把nu1l或undefined转换为对象,则会抛出一个类型错误(TypeError)。Object()函数在这种情况下不会抛出异常:它仅简单地返回一个新创建的空对象。
JavaScript中的某些运算符会做隐式的类型转换,有时用于类型转换。如果“+”运算符的一个操作数是字符串,它将会把另外一个操作数转换为字符串。一元“+”运算符将其操作数转换为数字。同样,一元“!”运算符将其操作数转换为布尔值并取反。在代码中会经常见到这种类型转换的惯用法:
x+" // 等价于String(x)
+X // 等价于 Number(x).也可以写成 x—0
!!x // 等价于 Boolean(x).注意是双叹号
在计算机程序中数字的解析和格式化是非常普通的工作,JavaScript中提供了专门的函数和方法用来做更加精确的数字到字符串(number—to—string)和字符串到数字(string-to-number)的转换。
Number类定义的toString()方法可以接收表示转换基数(radix)的可选参数,如果不指定此参数,转换规则将是基于十进制。同样,亦可以将数字转换为其他进制数(范围在2~36之间),例如:
var n=17;
binary_string·n.toString(2); // 转换为“10001”
octal_string-"0"+n.toString(8); // 转换为“021”
hex_string-"ox"+n.tostring(16); // 转换为“0x11"
当处理财务或科学数据的时候,在做数字到字符串的转换过程中,你期望自己控制输出中小数点位置和有效数字位数,或者决定是否需要指数记数法。Number类为这种数字到字符串的类型转换场景定义了三个方法。toFixed()根据小数点后的指定位数将数字转换为字符串,它从不使用指数记数法。toExponential()使用指数记数法将数字转换为指数形式的字符串,其中小数点前只有一位,小数点后的位数则由参数指定(也就是说有效数字位数比指定的位数要多一位),toPrecision()根据指定的有效数字位数将数字转换成字符串。如果有效数字的位数少于数字整数部分的位数,则转换成指数形式。我们注意到,所有三个方法都会适当地进行四舍五入或填充0。看一下下面几个例子:
var n=123456.789;
n.toFixed(0); //"123457”
n.toFixed(2); //"123456.79”
n.toFixed(5); //"123456.78900"
n.toExponential(1); //"1.2e+5"
n.toExponential(3); //"1.235e+5"
n.toPrecision(4); //"1.235e+5"
n.toPrecision(7); //"123456.8"
n.toPrecision(10); //"123456.7890"
如果通过Number()转换函数传入一个字符串,它会试图将其转换为一个整数或浮点数直接量,这个方法只能基于十进制数进行转换,并且不能出现非法的尾随字符。parseInt()函数和parseFloat()函数(它们是全局函数,不从属于任何类的方法)更加灵活。parseInt()只解析整数,而parseFloat()则可以解析整数和浮点数。如果字符串前缀是“0x”或者“ox” , parseInt()将其解释为十六进制数2, parseInt()和parseFloat()都会跳过任意数量的前导空格,尽可能解析更多数值字符,并忽略后面的内容。如果第一个非空格字符是非法的数字直接量,将最终返回NaN:
parseInt("3 blind mice") // => 3
parseFloat(" 3.14 meters") // => 3.14
parselnt ("-12.34") // => -12
parseInt("OxFF") // => 255
parseInt ("oxff") // => 255
parseInt ("-OXFF") // => -255
parseFloat(“.1”) // => 0.1
parseInt ("o.1") // => 0
parseInt(".1") // => NaN:整数不能以“.”开始
parsefloat("$72.47"): //=> NaN:数字不能以“$”开始
parseInt()可以接收第二个可选参数,这个参数指定数字转换的基数,合法的取值范围是2—36,例如:
parselnt ("11", 2); // => 3 (1*2+1)
parseInt ("ff", 16); // => 255 (15*16 + 15)
parseInt ("zz", 36); // => 1295 (35*36 + 35)
parseInt ("077", 8); // => 63 (7*8+7)
parseInt("077", 10); // => 77(7*10 +7)