JavaScript 是一种弱类型或者说是一门动态语言,这意味着你不用提前声明变量的类型,而是在程序运行过程中,运算符会自动将值转换为正确的类型,但也有一些情况需要强制类型转换。
以下我将介绍将各种类型的值,分别转换成数字、字符串或者布尔值(基于ES5规范)。
ToNumber
(1)Number()
使用Number函数,可以将任意类型的值转化成数值。
//数值Number(123) // 123 转换后为原值//字符串Number('123') // 123 转换为相应的数值,前提能被解析为数值 //字符串Number('123abc') // NaN 如果不能被解析为数值,则返回 NaN//布尔值Number(true) // 1Number(false) // 0//undefinedNumber(undefined) // NaN//nullNumber(null) // 0//对象Number({ a: 1}) // NaNNumber([5]) // 5 //包含单个数值的数组将返回数字复制代码
(2)ParseInt()
parseInt
函数可用于将字符串转为整数。
parseInt('123') // 123parseInt(' 123') // 123 如果字符串头部有空格,空格会被自动去除parseInt(1.23) // 1 如果参数不是字符串,则会先转为字符串再转换parseInt('8a') // 8 如果遇到不能转为数字的字符,就不再进行下去,返回可转的部分parseInt('abc') // NaN 如果第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaNparseInt('+1') // 1parseInt('1000', 10) // 1000 第二个参数(2到36之间),表示被解析的值的进制复制代码
如上,Number()
函数会整体将目标字符串转为数值,只要有一个字符无法转成数值,目标就会被转为NaN
,这点要比parseInt()
函数严格很多。
这里要注意一点,就是转换'011'时看起来01结构是8进制,实际上JS经过升级,后面加逗号8才是转为8进制或其他进制。
parseInt('011') // 11parseInt('011' , 8) // 9复制代码
(3)ParseFloat() parseFloat
函数用于将一个字符串转为浮点数。
parseFloat('3.14') // 3.14parseFloat('3.14more') // 3.14 如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分parseFloat([]) // NaNparseFloat('AAA') // NaNparseFloat('') // NaN 如果参数不是字符串或空,亦或字符串的第一个字符不能转化为浮点数,则返回NaN复制代码
上面代码中,尤其注意的是,parseFloat
会将空字符串转为NaN
。
这些特点使得parseFloat
的转换结果不同于Number
函数。
Number(true) // 1parseFloat(true) // NaNNumber(null) // 0parseFloat(null) // NaNNumber('') // 0parseFloat('') // NaNNumber('1.23A') // NaNparseFloat('1.23A') // 1.23复制代码
(4)字符串减0
字符串数字后直接减一个0,可将字符串转为数值。
'1' - 0 // 1'123' - 0 // 123'1.23' - 0 // 1.23'12A' - 0 // NaN 字符串里不是数字,则返回NaN'null' - 0 // NaN复制代码
上面代码中,字符串减0操作既有parseInt
、也有parseFloat
的功能。
还比较省代码数量,在实际应用中会比较常见。
(5)字符串前加+
字符串数字前加一个+,可将字符串转为数字。
+ '1' // 1+ '1.23' // 1.23+ '.1' // 0.1+ '-1' // -1+ '12A' // NaN复制代码
上面代码中,字符串前加+操作也有parseInt
和parseFloat
的功能。
ToString
(1)toString()
// 数值var a = 123a.toString() // "123"// 布尔值var a = truea.toString() // "true"// undefinedvar a = undefineda.toString() // 报错// nullvar a = nulla.toString() // 报错// 对象var a = {}a.toString() // "[object Object]"复制代码
上面代码中,注意一点null
、undefined
用toString()
转为字符串是不行的,而且toString()
方法占的字节较多,那么有别的解决方法吗?
(2)加''(双引号)
当然有,更常用的转为字符串方法为:
// 数值1 + '' // "1" '' + 1 // "1" // 布尔值true + '' // "true"'' + true // "true"// undefinedundefined + '' // "undefined"// nullnull + '' // "null"// 对象var obj = {}obj + '' // "[object Object]"[1, 2, 3] + '' // "1,2,3" 数组,返回该数组的字符串形式复制代码
相比toString()
方法,这种方法更为常用,且和前后加''的顺序无关。
(3)String()
String
函数可以将任意类型的值转化成字符串。
// 数值String(123) // "123"// 布尔值String(true) // "true"// undefinedString(undefined) // "undefined"// nullString(null) // "null"// 对象String({ a: 1}) // "[object Object]"String([1, 2, 3]) // "1,2,3" 数组,返回该数组的字符串形式复制代码
ToBoolean
(1)Boolean()
Boolean
函数可以将任意类型的值转为布尔值。
它的转换规则比较简单:除了以下五个falsy
值的转换结果为false
,其余的值全部为true
。
Boolean(undefined) // falseBoolean(null) // falseBoolean(0) // false 包括+0、-0Boolean(NaN) // falseBoolean('') // false 和""一样都为空字符串,这里当成同一种复制代码
所以的话,所有对象(包括空对象)的转换结果都是true
,甚至连false
对应的布尔对象new Boolean(false)
也是true
。
Boolean({}) // trueBoolean([]) // trueBoolean(new Boolean(false)) // true复制代码
这里需要注意的是,Boolean()
操作对于''和' '(中间有空格)的结果是不一样的:
Boolean('') // falseBoolean(' ') // true 因为中间有空格,代表有空格键输入,不算真正意义上的无内容复制代码
(2)类型值前加!!
任何数据类型值前面加两个!!,都可以将其转为布尔类型。
!!undefined // false!!null // false!!0 // false !!NaN // false!!'' // false 复制代码
从Boolean()
九个字符变为!!两个字符,省了代码量;转换规则也与Boolean
函数一致,故老手多用此类方法。
目前总结的就这么多啦,如有一些遗漏或有误的地方,欢迎大家指正~
本人Github链接如下,欢迎各位Star