类型转换,指的是将“一种数据类型”转换为“另外一种数据类型”。数据类型,我们在2.3节给大家介绍过了。而2.4这一节讲到,如果一个数字与一个字符串相加,则JavaScript会自动将数字转换成字符串,然后再与另外一个字符串相加,例如"2018"+1000的结果是"20181000",而不是3018。其中,“JavaScript会自动将数字转换成字符串”指的就是类型转换。
在JavaScript中,共有2种类型转换。
- (1)隐式类型转换
- (2)显式类型转换
隐式类型转换,指的是JavaScript自动进行的类型转换。显式类型转换,指的是需要我们手动用代码强制进行的类型转换。这两种方式,我们从名字上就能区分开来。
对于隐式类型转换,这里就不作介绍了,大家只需要把“2.4 运算符”这一节中的加号运算符涉及的内容认真学习一遍,就可以走很远了。在接下来的这一节中,我们重点介绍一下显式类型转换的两种情况。
一、“字符串”转换为“数字”
在JavaScript中,想要将字符串转换为数字,可以有2种方式。
- (1)Number()
- (2)parseInt()和parseFloat()
Number()方法可以将任何“数字型字符串”转换为数字。那什么是数字型字符串呢?像"123"、“3.1415”,这些只有数字的字符串就是数字型字符串,而"hao123"、"100px"等就不是。
准确来说,parseInt()和parseFloat是提取“首字母为数字的任意字符串”中的数字,其中,parseInt()提取的是整数部分,parseFloat()不仅会提取整数部分,还会提取小数部分。
举例:Number()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
var a = Number("2018") + 1000;
document.write(a);
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
从之前的学习可以知道,“2018”+1000结果是"20181000"。我们在这里使用了Number()方法将"2018"转换为一个数字,因此Number(“2018”)+1000的结果是3018。
举例:Number()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
document.write("Number('123'):" + Number("123") + "<br/>");
document.write("Number('3.1415'):" + Number("3.1415") + "<br/>");
document.write("Number('hao123'):" + Number("hao123") + "<br/>");
document.write("Number('100px'):" + Number("100px"));
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
NaN指的是“Not a Number(非数字)”,从中可以看出,Number()方法只能将纯“数字型字符串”转换为数字,不能将其他字符串(即使字符串内有数字字符)转换为数字。在实际开发中,很多时候我们需要提取类似"100px"中的数字,要怎么做呢?这个时候就应该使用parseInt()和parseFloat(),而不是Number()了。
举例:parseInt()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
document.write("parseInt('123'):" + parseInt("123") + "<br/>");
document.write("parseInt('3.1415'):" + parseInt("3.1415") + "<br/>");
document.write("parseInt('hao123'):" + parseInt("hao123") + "<br/>");
document.write("parseInt('100px'):" + parseInt("100px"));
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
从这个例子可以看出来,parseInt()会从左到右进行判断,如果第1个字符是数字,则继续判断,直到出现非数字为止(小数点也是非数字);如果第1个字符是非数字,则直接返回NaN。
举例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
document.write("parseInt('+123'):" + parseInt("+123") + "<br/>");
document.write("parseInt('-123'):" + parseInt("-123"));
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
前面我们说过,对于parseInt()来说,如果第1个字符不是数字,则返回NaN。但是这里第1个字符是加号(+)或减号(-),也就是非数字,parseInt()同样也是可以转换的。因为加号和减号在数学上其实就是表示一个数的正和负,所以parseInt()可以接受第1个字符是加号或减号。同样的,parseFloat()也有这个特点。
举例:parseFloat()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
document.write("parseFloat('123'):" + parseFloat("123") + "<br/>");
document.write("parseFloat('3.1415'):" + parseFloat("3.1415") + "<br/>");
document.write("parseFloat('hao123'):" + parseFloat("hao123") + "<br/>");
document.write("parseFloat('100px'):" + parseFloat("100px"));
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
parseFloat()跟parseInt()非常类似,都是从第1个字符从左到右开始判断。如果第1个字符是数字,则继续判断,直到出现除了数字和小数点之外的字符为止;如果第1个字符是非数字,则直接返回NaN。
在“首字母是+、-或数字的字符串”中,不管是整数部分,还是小数部分,parseFloat()同样可以转换,这一点跟parseInt()是不一样的。
二、“数字”转换为“字符串”
在JavaScript中,想要将数字转换为字符串,也有2种方式。
- (1)与空字符串相加
- (2)toString()
举例:与空字符串相加
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
var a = 2018 + "";
var b = a + 1000;
document.write(b);
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
数字加上字符串,系统会将数字转换成字符串。如果想要将一个数字转换为字符串,而又不增加多余的字符,我们可以将这个数字加上一个空字符串。
举例:toString()
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script>
var a = 2018;
var b = a.toString() + 1000;
document.write(b);
</script>
</head>
<body>
</body>
</html>
浏览器预览效果如图所示。
分析:
a.toString()表示将a转换为字符串,也就是2018转换为"2018",因此最终b的值为"20181000"。
在实际开发中,如果想要将数字转换为字符串来用,我们很少使用toString()方法,而更多使用隐式类型转换的方式(也就是直接跟一个字符串相加)就行了。