数字是编程的一个重要部分。它们允许我们执行类似这样的任务:计算总的销售成本,确定两点之间的距离,或者通过产生1~6之间的一个随机数来模拟掷色子。JavaScript有很多不同的方法来操作数字。
当我们创建一个变量的时候,可以像下面这样在其中存储数字:
var a=3.25;
然而,有时候,数字实际上是一个字符串。例如,如果我们使用prompt()方法(参见2.7节)来获取访问者的输入,即便某人输入了3.25,我们最终还是得到包含了数字的一个字符串。换句话说,结果是’3.25’(一个字符串)而不是3.25(一个数字)。通常,这种方法不会导致问题,因为JavaScript解释器在看到需要一个数字的时候,通常会将一个字符串转换为数字。例如:
var a=’3’;
var b=’4’;
alert(a*b);//12
在这个例子中,即便变量a和b都是字符串,JavaScript解释器也会将它们都转换为数字,以执行乘法运算(3×4),然后返回结果12。然而,当你使用+操作符的时候,JavaScript解释器不会进行这一转换,它最终得到了有些奇怪的结果:
var a=’3’;
var b=’4’;
alert(a+b);//34
在这个例子中,a和b都是字符串;+操作符不仅执行数学加法,它还会将两个字符串组合(连接)起来(参见2.5.2节)。因此,在这个例子中,将3和4相加,得到的不是7,最终得到的是将两个字符串连接在一起的结果:34。
当我们需要将一个字符串转换为一个数字的时候,JavaScript提供了如下几种方法:
·Number()将传递给它的任何字符串转换为一个数字,例如:
var a=’3’;
a=Number(a);//a is now the number 3
因此,将两个包含数字的字符串相加所导致的问题,可以通过如下方法修正:
var a=’3’;
var b=’4’;
var total=Number(a)+Number(b);//7
一种更快的方法是使用+操作符,它和Number()做相同的事情。只要在包含字符串的一个变量的前面添加一个+,并且JavaScript解释器会将该字符串转换为一个数字:
var a=’3’;
var b=’4’;
var total=+a++b//7
这两种方法的缺点是,如果字符串包含了数字以外的任何内容,一个句点,或者是字符串开始处的一个+或-符号,我们最终会得到一个非数字值,或者是JavaScript值NaN,后者表示“不是一个数字”(参见后面内容的介绍)。
·parseInt()也试图将一个字符串转换为一个数字。然而,和Number()不同,parseInt()甚至尝试将带有字母的一个字符串转换为一个数字,只要该字符串是以数字开始的。当我们得到一个类似’20 years'的字符串作为对年龄问题的一个回答的时候,这个函数很方便:
var age=’20 years';
age=parseInt(age,10);//20
parseInt()方法在字符串的开始查找一个数字或一个+或-符号,直到它遇到一个非数字。因此,在上面的例子中,它返回数字20并且忽略掉字符串的其他部分'years'。
注意:你可能会问,parseInt(age,10);中的10是做什么用的。JavaScript可以处理八进制数字(它是以8为基数,包含0~7的不同数字;和十进制数不同,后者是以10为基数,包含0~9的不同数字);当我们给parseInt()函数添加10的时候,我们告诉JavaScript解释器,将任何的输入都当做十进制数字对待。通过这种方法,JavaScript可以将提示窗口或表单字段中‘08’这样的一个字符串正确地按照十进制来解释。例如,在这段代码中,age可能等于0:
var age=’08 years';
age=parseInt(age);
然而,在下面的代码中,变量age可能保存了值8:
var age=’08 years';
age=parseInt(age,10);
换句话说,当使用parseInt()方法的时候,总是添加一个10。
·parseFloat()类似于parseInt(),但是,当一个字符串可能包含一个十进制小数的时候使用它。例如,如果有一个类似’4.5 acres'的字符串,我们可以使用parse Float()来获取包含小数位数的整个值:
var space=’4.5 acres';
space=parseFloat(space);//4.5
如果在上面的例子中使用parseInt(),最终得到的只是数字4,因为parseInt()只是尝试获取整数。
无论使用上面介绍的哪个方法,都需要根据情况而定:如果目标是将两个数相加,但是它们都是字符串,那么使用Number()或+操作符。然而,如果想要从可能包含字母的一个字符串中提取一个数字,例如,’200px'或’1.5em',那么使用parseInt()来捕获整数(例如,200),或者使用parseFloat()来捕获小数(例如,1.5)。