JavaScript中的数据类型转换
目录
这里总结了JavaScript中常见的数据类型转换
1 字符串 to 数值
显式转换
通常的做法是使用 Number()
,parseInt()
, parseFloat()
函数。需要注意的是, Number() 的参数不能含有非数字字符串值 ,如 Number(100x
) 会得到 Nan, 而 parseInt(), parseFloat() 则是参数的第一个字符不可以是非数字,否则会得到 Nan, 而且它会忽略第一个非数字的字符串之后的所有字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
js>Number<('100x') NaN js>parseInt('100x') 100 js>parseFloat('100x') 100 js>parseInt('10d20x') 10 js>parseFloat('10d20x') 10 js>Number('10d20x') NaN js>parseInt('a10d20x') NaN js>parseFloat('a10d20x') NaN js>Number('a10d20x') NaN |
对于 parseInt() 函数来说,可以指定进制。早期版本的 JavaScript 默认执行 8 进制转换,而新版本使用 10 进制 进行转换。如果需要保证兼容性,则需要带上第二个参数:
1 2 3 4 5 6 7 8 9 10 11 12 |
js>parseInt('11',2) 3 js>parseInt('11',3) 4 js>parseInt('11',4) 5 js>parseInt('11',8) 9 js>parseInt('11',10) 11 js>parseInt('11',16) 17 |
隐式转换
数值的字符串变量(指可以通过 Number函数转换为数值的字符串,本节中的字符串均指可以通过 Number() 转换为数值的字符串) 在遇到数值运算符时可能发生隐式转换:
对于减法运算,总是可以转换为数值 :
1 2 3 4 5 6 |
js>var arr = ['100' - 1, '100' - '1', '100' - '', 100 - '1'] js>for(i in arr){console.log(arr[i],typeof(arr[i]))} 99 "number" 99 "number" 100 "number" 99 "number" |
对于加法运算,如果两个操作数中有一个为字符串,则结果会转换成字符串 :
1 2 3 4 |
js>var arr = ['100' + 1, 1 + '100'] js>for(i in arr){console.log(arr[i],typeof(arr[i]))} 1001 string 1100 string |
这是因为此时 “+” 的意义为字符串连接操作符。
不过还有一种情况:
1 2 |
js>typeof +'100' "number" |
此时 "+" 运算符没有实质的意义,其作用就仅仅是将字符串值转换为数值。
2 数值 to 字符串
显式转换
通常是使用 String()
函数 或 toString()
函数
1 2 3 4 |
js>typeof String(100) "string" js>typeof (100).toString() "string" |
注意,在使用字面量直接调用 toString() 函数的时候, 为了避免点号到底是小数点还是点运算符,我们需要给字面量加上括号。
隐式转换
如上节所示,使用 "+" 运算符可以将数值隐式地转换为字符串:
1 2 3 4 5 6 |
js>'s' + 100 "s100" js>100 + 's' "100s" js>100 + '' "100" |
3 字符串<->数值 转换的惯用法
从前两节可以看到字符串和数值之间的类型转换有多种方法。具体到哪种方法速度更快,不能一概而论,这要看具体的实现。使用显式转换可读性更好,而使用隐式转换代码更简洁更有利于传输。一般我们会使用空字符串来进行隐式地转换:
1 2 3 4 |
js>100 + '' //数值转换为字符串 "100" js>"100" - '' //字符串转换为数值 100 |
4 转换为布尔型
在 javaScript 的条件语句中(如 if
, while
语句),任何值都将被转换为布尔类型。
下面这种情况将会被转换成 false
:
- 数值 0
- 数值 Nan
- null 值
- undefine 值
- 空字符串值 ''
除此之外的其他情况将会被转换成 true
还可以使用 Boolean()
来进行显式转换,或者使用 逻辑非运算符 '!' 来进行转换:
1 2 3 4 |
js>var b = !!1 true js>var b = !!'' false |
5 Object 类型 to 基本类型
假设 obj
为一个 Object 类型的对象,则有:
String(obj)
将调用toString(obj)
方法Number(obj)
将优先调用valueOf(obj)
方法,如果valueOf(Obj)
的结果无法被转换为数值型,则再调用toString(obj)
方法Boolean(obj)
总是true
如下示例:
1 2 3 4 5 6 7 8 |
js>var obj = {} js>String(obj) "[object Object]" js>obj.toString = function(){return 'Hi'} //重写 toString() 方法 js>String(obj) "Hi" js>obj + '' //隐式转换 "Hi" |
6 基本类型 to Object 类型
基本类型转换为 Object 类型一般使用其对应的类,如字符串使用 String
类,数值使用 Number
类, 布尔使用 Boolean
类
1 2 |
js>var s = 'Hi' js>var obj = new String(s) |