JavaScript是一种无类型语言,但同时JavaScript提供了一种灵活的自动类型转换的处理方式。基本规则是,如果某个类型的值用于需要其他类型的值的环境中,JavaScript就自动将这个值转换成所需要的类型。
以下列出JavaScript一种特定类型用于一种特定环境下时所执行的转换。
值 字符串 数字 布尔值 对象
未定义的值 "undefined" NaN false Error
null "null" 0 false Error
非空字符串 As is 字符串的数 true String对象
字值或NaN
空字符串 As is 0 false String对象
0 "0" As is false Number对象
NaN "NaN" As is false Number对象
无穷大 "Infinity" As is true Number对象
负无穷大 "-Infinity" As is true Number对象
其他所有数字 数字的字符串值 As is true Number对象
true "true" 1 As is Boolean对象
false "false" 0 As is Boolean对象
对象 toString() valueOf()或 true As is
toString()或
NaN
需要注意,对象在处于布尔环境中,就会被转换成true。把对象转换成数字是通过首先调用该对象的valueOf()方法,大多数对象继承了Object对象的默认valueOf()方法,它只是返回对象自身,由于默认的valueOf()方法不返回原始值,所以接下来JavaScript通过调用对象的toString()方法,再将生产的字符串转换成数字来吧对象转换成数字。
具体说明参见《JavaScript权威指南》第204页。
除了自动转换,JavaScript还提供了一种显式地将值从一种类型转换为另一种类型的转换工具。如Number()、Boolean()、String()和Obejct()都可以作为函数调用,它们可以将参数转换成合适的类型。
下面介绍一些显式转换的技巧:
要把一个值转换成字符串,可以把它连接到一个空串上
var x_as_string = x+" ";
要把一个值强制转换成数字,就用它减0
var x_as_number = x - 0 ;
要把一个值强制转换成布尔值,需要连用两次"!"运算符
var x_as_boolean = !!x;
从数字到字符串的转换在JavaScript中是最常执行的。我们可以通过以下方法显式的实现:
var str = String(number);
var str = number + "";
var string = number.toString(); //number被转换成Number对象,再调用Number.toString()方法
Number.toString()方法可以指定基数(2和36之间),如果没有指定,默认基数为10。
在ECMAScript v3和JavaScript 1.5中,添加了三种将数字转换成字符串的方法,用于显示具有传统格式的数字(如表示货币的数字)。方法toFixed()将把数字转换成字符串,并显示小数点后指定的位数。方法toExponential()用指数计数法把数字转换成字符串,该字符串中的小数点前有一位数字,小数点后指定位数的数字。方法toPrecision()用指定位数的有效数字显示数字,如果有效数字的位数不足以显示数字的整数部分,它将采用指数计数法显示数字。这三种方法都回对结果字符串的数字进行适当舍入。
var n = 123456.789;
n.toFixed(0); //"123457"
n.toFixed(2); //"123456.79"
n.toExponential(1); //"1.2e+5"
n.toExponential(3); //"1.235e+5"
n.toPrecision(4); //"1.235e+5"
n.toPrecision(7); //"123456.8"
表示数字的字符串在数字环境中会自动转换成真正的数字。我们也可以显式地进行这一转换。
var num = Number(str);
var num = str - 0;
这种字符串到数字的转换方式,只能用于基数为10的数字,而且虽然它允许数字前后有空格,但是却不允许字符串中的数字之后出现任何非空格字符。为此JavaScript提供了更灵活的进行转换的函数parseInt()和parseFloat()这两个函数将转换并返回一个字符串开头的所有数字,并忽略其后所有非数字后缀。对于以0x和0X开头的字符串, parseInt()将它解释为十六进制数。
parseInt("3 abc"); //3
parseFloat("3.15 abc"); //3.15
parseInt("12.34"); //12
parseInt("0xFF"); //255
parseInt()还可以具有第二个参数,制定要被解析的数的基数。其合法值在2到36之间。
如果parseInt()和parseFloat()不能将指定的字符串转换成数字,将返回NaN:
parseInt("eleven"); //NaN
parseFloat("s12.35"); //NaN