博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript系列之类型转换
阅读量:6009 次
发布时间:2019-06-20

本文共 3462 字,大约阅读时间需要 11 分钟。

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复制代码

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

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]"复制代码

上面代码中,注意一点nullundefinedtoString()转为字符串是不行的,而且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

转载地址:http://aivmx.baihongyu.com/

你可能感兴趣的文章
关于云栖,有点无语的几个地方,管理能不能管?
查看>>
Windows线程的同步与互斥
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
内核随记(三)--同步(1)【转】
查看>>
C#进阶系列——MEF实现设计上的“松耦合”(四):构造函数注入
查看>>
MP3是什么
查看>>
AngularJs ng-change事件/指令(转)
查看>>
COGS 144. [USACO Dec07] 魅力手镯【01背包复习】
查看>>
word2007插件开发经验备忘2--如何操作word
查看>>
ExpandableListView 箭头样式
查看>>
【单页应用巨坑之History】细数History带给单页应用的噩梦
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
【jQuery】select动态追加的option选中
查看>>
linux系统下安装两个或多个tomcat
查看>>
使用eclipse生成html格式注释文档 [ javadoc ]
查看>>
ProtoBuffer 简单例子
查看>>
Winform开发框架中工作流模块的表设计分析
查看>>
sklearn
查看>>
iOS多线程开发系列之(一)NSThread
查看>>
微信小程序初体验(上)- 腾讯ISUX社交用户体验设计成员出品
查看>>