JavaScript 是一种弱类型或者说是一门动态语言,这意味着你不用提前声明变量的类型,而是在程序运行过程中,运算符会自动将值转换为正确的类型,但也有一些情况需要强制类型转换。

以下我将介绍将各种类型的值,分别转换成数字字符串或者布尔值(基于ES5规范)。

ToNumber

(1)Number()

使用Number函数,可以将任意类型的值转化成数值。

//数值
Number(123) // 123 转换后为原值

//字符串
Number('123') // 123 转换为相应的数值,前提能被解析为数值

//字符串
Number('123abc') // NaN 如果不能被解析为数值,则返回 NaN

//布尔值
Number(true) // 1
Number(false) // 0

//undefined
Number(undefined) // NaN

//null
Number(null) // 0

//对象
Number({a: 1}) // NaN
Number([5]) // 5 //包含单个数值的数组将返回数字

(2)ParseInt()

parseInt函数可用于将字符串转为整数。

parseInt('123')  // 123

parseInt(' 123') // 123 如果字符串头部有空格,空格会被自动去除

parseInt(1.23) // 1 如果参数不是字符串,则会先转为字符串再转换

parseInt('8a') // 8 如果遇到不能转为数字的字符,就不再进行下去,返回可转的部分

parseInt('abc') // NaN 如果第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
parseInt('+1') // 1

parseInt('1000', 10) // 1000 第二个参数(2到36之间),表示被解析的值的进制

如上,Number()函数会整体将目标字符串转为数值,只要有一个字符无法转成数值,目标就会被转为NaN,这点要比parseInt()函数严格很多。

这里要注意一点,就是转换’011’时看起来01结构是8进制,实际上JS经过升级,后面加逗号8才是转为8进制或其他进制。

parseInt('011')  // 11

parseInt('011' , 8) // 9

(3)ParseFloat()
parseFloat函数用于将一个字符串转为浮点数。

parseFloat('3.14')  //  3.14

parseFloat('3.14more') // 3.14 如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分

parseFloat([]) // NaN
parseFloat('AAA') // NaN
parseFloat('') // NaN 如果参数不是字符串或空,亦或字符串的第一个字符不能转化为浮点数,则返回NaN

上面代码中,尤其注意的是,parseFloat会将空字符串转为NaN

这些特点使得parseFloat的转换结果不同于Number函数。

Number(true) // 1
parseFloat(true) // NaN

Number(null) // 0
parseFloat(null) // NaN

Number('') // 0
parseFloat('') // NaN

Number('1.23A') // NaN
parseFloat('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

上面代码中,字符串前加+操作也有parseIntparseFloat的功能。

ToString

(1)toString()

// 数值
var a = 123
a.toString() // "123"

// 布尔值
var a = true
a.toString() // "true"

// undefined
var a = undefined
a.toString() // 报错

// null
var a = null
a.toString() // 报错

// 对象
var a = {}
a.toString() // "[object Object]"

上面代码中,注意一点nullundefinedtoString()转为字符串是不行的,而且toString()方法占的字节较多,那么有别的解决方法吗?

(2)加’’(双引号)

当然有,更常用的转为字符串方法为:

// 数值
1 + '' // "1"
'' + 1 // "1"

// 布尔值
true + '' // "true"
'' + true // "true"

// undefined
undefined + '' // "undefined"

// null
null + '' // "null"

// 对象
var obj = {}
obj + '' // "[object Object]"
[1, 2, 3] + '' // "1,2,3" 数组,返回该数组的字符串形式

相比toString()方法,这种方法更为常用,且和前后加’’的顺序无关。

(3)String()

String函数可以将任意类型的值转化成字符串。

// 数值
String(123) // "123"

// 布尔值
String(true) // "true"

// undefined
String(undefined) // "undefined"

// null
String(null) // "null"

// 对象
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3" 数组,返回该数组的字符串形式

ToBoolean

(1)Boolean()

Boolean函数可以将任意类型的值转为布尔值。

它的转换规则比较简单:除了以下五个falsy值的转换结果为false,其余的值全部为true

Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false 包括+0、-0
Boolean(NaN) // false
Boolean('') // false 和""一样都为空字符串,这里当成同一种

所以的话,所有对象(包括空对象)的转换结果都是true,甚至连false对应的布尔对象new Boolean(false)也是true

Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true

这里需要注意的是,Boolean()操作对于’’和’ ‘(中间有空格)的结果是不一样的:

Boolean('')  // false
Boolean(' ') // true 因为中间有空格,代表有空格键输入,不算真正意义上的无内容

(2)类型值前加!!

任何数据类型值前面加两个!!,都可以将其转为布尔类型。

!!undefined // false
!!null // false
!!0 // false
!!NaN // false
!!'' // false

Boolean()九个字符变为!!两个字符,省了代码量;转换规则也与Boolean函数一致,故老手多用此类方法。

目前总结的就这么多啦,如有一些遗漏或有误的地方,欢迎大家指正~

本人Github链接如下,欢迎各位Star

https://github.com/miqilin21/miqilin21.github.io



JavaScript      JavaScript 数据类型

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!