类型转换
《数据类型》章节中已经介绍到,在JavaScript
程序中,任何一个变量都会归属于一种数据类型。
不同的数据类型具有不同的用途,例如,屏幕输出就需要使用String
类型,公式计算就需要Number
类型,很多情况下,我们需要的数据类型和当前数据的类型往往是不匹配的。
例如,《JavaScript弹窗》中,我们使用prompt
函数获得的用户输入年龄本质上是个数字,但其实我们得到的是个字符串。
let age = prompt('age'); // 用户输入的数字
typeof age; // 得到的age类型是'string'
在这种情况下,如果我们需要比较年龄的大小,就需要将字符串转换为数字。
幸运的是,大多数情况下运算符和函数会自动的将值转换为正确的类型,无需我们劳心费力,我们称这种转换方式为隐式转换。
隐式转换
隐式转换几乎存在于编程的角角落落,只是我们不小心忽略了它们的存在。
转字符串
我们最熟悉的函数alert
用于展示各种消息,而这些消息都是以字符串的形式展现的,也就是说不论我们输入什么类型的数值,最终都会变成字符串输出到屏幕:
alert(18); //输出数字
alert('str'); //字符串
alert(true); //boolean
alert(null); //null
alert(undefined); //undefined
alert({}); //[object Object]
这种隐式转换在编程过程中是非常有用的,如果不使用隐式转换,那么就需要程序员手动的控制所有数据的类型,这无疑是痛苦的。
alert
函数对类型的转换在object
类型上尤为明显,由于object
类型结构复杂,alert
会统一将其转成[object Object]
。
转数字
在计算过程中,需要使用数字。而我们从用户、文件中获取的输入往往都是字符串,参与计算之前都需要先将字符串转换成数字。
在一定情况下,JavaScript
会将字符串默认的转为数字参与计算:
alert(9 * '6') //54
alert('6' * '6') //36
alert('7' * 8) //56
alert('6' / 2) //3
alert(9 / '3') //3
alert('18' / 9) //2
alert(1 - '1') //0
alert('1' - 2) //-1
alert('2' - '1') //1
alert(9 / 'xx') //NaN
alert(1 + true) //2
alert(2 - true) //1
alert(3 * true) //3
alert(8 / true) //8
alert(1 / false) //Infinity
alert(1 * false) //0
alert(1 - false) //1
alert(1 + false) //1
虽然我们直接使用了字符串参与计算,但得到的结果和数字直接计算毫无差别。
特殊的是,Boolean
也可以直接参与数学运算,其中true
被当作1
,false
被当作0
。
既然隐式转换如此智能,是不是说我们就可以高枕无忧了呢?并不是
例如:
alert(1 + "1") //"11"
alert("2" + 1) //"22"
以上计算在数学中显然是错误的,产生错误的原因在于字符串类型本身就有+
运算,也就是字符串拼接运算。
到这里,基本上我们就能总结隐式转换发送的情形:
- 如果数据类型本身能够直接计算,就直接计算并返回结果
- 如果数据类型本身不能直接计算,就转换类型后再计算
- 如果数据类型转换后还是不能计算,返回
NaN
显式转换
对于隐式转换无法解决的问题,我们就需要使用显式转换主动的修改数据类型,修改数据类型有三个方法:Number()
、String()
、Boolean()
.
Number()
Number()
函数会尝试将非数字类型的值转换为数字类型,语法如下:
let num = Number(value);
举个栗子:
let num = Number('124');
typeof num; //'number'
以上示例常用于将用户输入的内容转换为数字:
let ageStr = prompt('请输入年龄?');
let ageNum = Number(ageStr);
typeof ageNum; // number
当然,如果输入的字符串并非数字字符串,那么转换就会失败,函数返回NaN
:
let str = 'xyz';
let num = Number(str);
alert(num); // NaN
Number转换规则
原始值 | 转换值 |
---|---|
Number | Number |
undefined | NaN |
null | 0 |
true | 1 |
false | 0 |
string | 去首位空格后转为数字,不成功返回NaN,空串返回0 |
再举个李子:
alert(Number(' 996'));//996
alert(Number('xxx')); //NaN
alert(Number(true)) //1
String()
String()
函数能够将其他类型的值显式的转成字符串类型,再转换过程中,不会出现值样式的改变,即false
变为"false",null变为"null"。
Boolean()
Boolean()
类型转换则更为简单:
- 直观上为“空”的值,如
0
,""
,null
,undefined
和NaN
都将变为false
; - 其他值变为
true
。
举个例子:
Boolean(1)//true
Boolean("")//false
Boolean("x")//true
Boolean('0')//true
你学废了吗?再来一节吧!!