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