JavaScript系列之类型转换

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

github.com/miqilin21/m…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值