前言
首先,在 JavaScript 中,基础类型有:Number、Boolean、String、null、undefined、Synbol、bigInt。
但在 JavaScript 中类型转换只有如下三种情况:
- 转换为 string;
- 转换为 number;
- 转换为 boolean。
下面我将依次介绍这几种情况的数据类型转换。
转为字符串
toString()
- number 转 string
1 2 3
| var num = 10 var str = num.toString() console.log(str, typeof str)
|
- boolean 转 string
1 2 3 4 5 6
| var a1 = true var a2 = false var b1 = a1.toString() var b2 = a2.toString() console.log(b1, typeof b1) console.log(b2, typeof b2)
|
- null / undefined 转 string
1 2 3 4 5
| var a1 = null var a2 = undefined var n = a1.toString() var u = a2.toString() console.log(n, u)
|
- object 转 string
1 2 3 4 5 6 7 8 9
| var obj = { name: 'LqZww', age: 20 } var arr = [1, 2, 3] var s1 = obj.toString() var s2 = arr.toString() console.log(s1, typeof s1) console.log(s2, typeof s2)
|
使用“ ‘’ ”和“ + ”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| console.log(1 + '')
console.log(true + '')
var obj = { name: 'LqZww', age: 20 } console.log(obj + '')
console.log([1, 2, 3] + '')
console.log(null + '')
console.log(undefined + '')
|
我们可以看出:“ + ” 如果发现左边或右边任意一边有字符串,就会尝试把另外的一边也变为字符串。
String()
String()
全局对象是一个用于字符串或一个字符序列的构造函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| console.log(String(10))
console.log(String({ name: 'LqZww', age: 20 }))
console.log(String([1, 2, 3]))
console.log(String(true))
console.log(String(false))
console.log(String(null))
console.log(String(undefined))
|
注意
- 使用
toString()
方法不会影响到原变量,它会将转换的结果返回;
- 数值类型调用
toString()
方法时,可以带一个参数,将输出对应进制的值;
- null、undefined 没有
toString()
方法。如果需要转换,应该使用 String()
;
- 对于 number、boolean 类型,
String()
方法相当于调用了 toString()
方法。
转为数字
Number()
- string 转 number
如果是纯数字的字符串,则直接转换为数字。
1 2 3
| var a = '1234' var b = Number(a) console.log(b, typeof b)
|
如果字符串为空或者是空格字符串,则转换为 0。
1 2 3 4 5 6
| var a1 = '' var a2 = ' ' var b1 = Number(a1) var b2 = Number(a2) console.log(b1, typeof b1) console.log(b2, typeof b2)
|
如果字符串中有非数字的内容,转为 NaN。
1 2 3
| var a = '1234LqZww' var b = Number(a) console.log(b, typeof b)
|
- boolean 转 number
1 2 3 4 5 6
| var a1 = true var a2 = false var b1 = Number(a1) var b2 = Number(a2) console.log(b1, typeof b1) console.log(b2, typeof b2)
|
- null / undefined 转 number
1 2 3 4 5 6
| var a1 = null var a2 = undefined var b1 = Number(a1) var b2 = Number(a2) console.log(b1, typeof b1) console.log(b2, typeof b2)
|
parseInt()
parseInt(string, radix)
解析一个字符串并返回指定基数的十进制整数, radix 是 2~36 之间的整数,表示被解析字符串的基数。
- 有两个参数,第一个参数是要转换的字符串,第二个参数是要转换的进制;
- 从第一位有效数字开始,直到遇到无效数字;
- 如果第一位不是有效数字,则直接返回 NaN。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| console.log(parseInt('10LqZww'))
console.log(parseInt('20lq44'))
console.log(parseInt('qaz20'))
console.log(parseInt(''))
console.log(parseInt('011', 10))
console.log(parseInt('011', 8))
console.log(parseInt(false))
console.log(parseInt(true))
|
parseFloat()
parseFloat()
函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。
- 不支持第二个参数,只能解析十进制数;
- 从第一位有效数字开始,直到遇到无效数字;
- 如果第一位不是有效数字,则直接返回 NaN;
- 如果解析的内容只有整数,则只解析成整数。
1 2 3 4 5 6 7 8 9 10 11 12 13
| console.log(parseFloat('12'))
console.log(parseFloat('1.234'))
console.log(parseFloat('1.234xx'))
console.log(parseFloat('1.2.3xx'))
console.log(parseFloat('qaz111'))
console.log(parseFloat(false))
console.log(parseFloat(true))
|
使用’ ‘ - 0
1 2 3 4 5 6 7 8 9
| console.log('1.23' - 0)
console.log('1.23rem' - 0)
console.log('qaz123' - 0)
console.log(true - 0)
console.log(false - 0)
|
使用 + ‘ ‘
1 2 3 4 5 6 7 8 9 10 11 12 13
| console.log(+'1.23')
console.log(+'-1.23')
console.log(+'.1')
console.log(+'12rem')
console.log(+'re12m')
console.log(+false)
console.log(+true)
|
转为布尔值
Boolean()
1 2 3 4 5 6 7 8 9 10
| console.log(Boolean(1)) console.log(Boolean(' ')) console.log(Boolean('qqq')) console.log(Boolean({}))
console.log(Boolean(0)) console.log(Boolean('')) console.log(Boolean(null)) console.log(Boolean(undefined)) console.log(Boolean(NaN))
|
!!
1 2 3 4 5 6 7 8 9 10 11 12
| console.log(!!true) console.log(!!1) console.log(!!' ') console.log(!!{}) console.log(!![]) console.log(!! function() {})
console.log(!!null) console.log(!!undefined) console.log(!!NaN) console.log(!!0) console.log(!!'')
|
注意
- 在所有值中只有七个值转为 boolean 是 false:0、-0、NaN、‘’(空字符串)、null、undefined、false。
- 所有的对象都为 true。
结语
最后我们再来看看下面这个表格:
原始值 |
目标 |
结果 |
number |
字符串 |
1 -> ‘1’ |
boolean、symbol、函数 |
字符串 |
‘true’ |
数组 |
字符串 |
[1, 2, 3] -> ‘1, 2, 3’ |
对象 |
字符串 |
‘[object Object]’ |
string |
数字 |
‘1’ -> 1 |
null |
数字 |
0 |
symbol |
数字 |
报错 |
数组 |
数字 |
空数组为0;存在元素且为数字转数字;其他情况NaN |
除数组的引用类型 |
数字 |
NaN |
number |
布尔值 |
除了NaN、0、-0都为true |
string |
布尔值 |
除了空字符串都为true |
null、undefined |
布尔值 |
false |
引用类型 |
布尔值 |
true |