14.3 操作数字

数字是编程的一个重要部分。它们允许我们执行类似这样的任务:计算总的销售成本,确定两点之间的距离,或者通过产生1~6之间的一个随机数来模拟掷色子。JavaScript有很多不同的方法来操作数字。

14.3.1 将字符串更改为数字

当我们创建一个变量的时候,可以像下面这样在其中存储数字:


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)。