JavaScript 网页编程从入门到精通 (清华社"视频大讲堂"大系·网络开发视频大讲堂)
上QQ阅读APP看书,第一时间看更新

5.3 算术运算符

算术运算符包括加(+)、减(-)、乘(*)、除(/)、余数运算符(%)、数值取反运算符(-)。

5.3.1 加法运算

【示例1】特殊运算数的运算结果比较特殊,需要特别留意。

      var n=5;                                     //定义并初始化任意一个数值
      alert(NaN+n);                                //返回NaN。NaN与任意运算数相加,结果都是NaN
      alert(Infinity+n);                           //返回Infinity。Infinity与任意运算数相加,结果都是Infinity
      alert(Infinity+Infinity);                    //返回Infinity。Infinity与Infinity相加,结果是Infinity
      alert((-Infinity)+(-Infinity));              //返回-Infinity。负Infinity相加,结果是负Infinity
      alert((-Infinity)+Infinity);                 //返回NaN。正负Infinity相加,结果是NaN

【示例2】加运算符能够根据运算数的数据类型,尽可能地把数字转换成可以执行相加或相连运算的数值或字符串。

      alert(1+1);                             //返回2。如果运算数都是数值,则进行相加运算
      alert(1+"1");  //返回"11"。如果运算数中有一个是字符串,则把数值转换为字符串,然后进行相连运算
      alert("1"+"1");                        //返回"11"。如果运算数都是字符串,则进行相连运算

【示例3】下面两个表达式中,由于空字符串的位置不同,运算结果也不同。在第一行代码中,3.0和4.3都是数值类型,因此加号运算符就执行相加操作,由于第3个运算数是字符串,则把第一个加号运算结果转换为字符串并与空字符串进行相连操作。而第二行代码中则不同,第一个加号运算符首先把数值3.0转换为字符串,然后执行连接操作,所以结果也就不同。

      alert(3.0+4.3+"")                      //返回"7.3"
      alert(3.0+""+4.3)                      //返回"34.3"

提示:为了避免误解,使用加法运算符时,应先检查运算数的数据类型是否符合需要。

5.3.2 减法运算

【示例1】特殊运算数的运算结果比较特殊,需要特别留意。

      var n=5;                                   //定义并初始化任意一个数值
      alert(NaN-n);                              //返回NaN。NaN与任意运算数相减,结果都是NaN
      alert(Infinity-n);                         //返回Infinity。Infinity与任意运算数相减,结果都是Infinity
      alert(Infinity-Infinity);                  //返回NaN。Infinity与Infinity相减,结果是NaN
      alert((-Infinity)-(-Infinity));            //返回NaN。负Infinity相减,结果是NaN
      alert((-Infinity)-Infinity);               //返回-Infinity。正负Infinity相减,结果是-Infinity

【示例2】在减法运算中,如果有一个运算数不是数字,则返回值为NaN;如果数字为字符串,则会把它转换为数值之后,再进行运算。

      alert(2-"1");                           //返回1
      alert(2-"a");                           //返回NaN

利用减法运算可快速把一个值转换为数字。例如,由于HTTP请求值一般都是字符串数字,可以让这些字符串减去0快速转换为数值。这与调用parseFloat()方法结果相同,但减法运算符更高效、更快捷。减法运算符的隐性转换如果失败,则返回NaN,这与使用parseFloat()方法执行转换时返回值是不同的。

【示例3】对于字符串来说,减法运算符能够完全匹配进行转换,如果字符串是非数字的值,则返回NaN;而parseFloat()方法则通过逐字符解析并努力转换为数值。

例如,对于字符串"100aaa"而言,parseFloat()方法能够解析出前面几个数字,而对于减法运算符来说,则必须是完整的数字时,可以进行完全匹配转换。

      alert(parseFloat("100aaa"));                 //返回100
      alert(parseFloat("aaa100"));                 //返回NaN
      alert("100aaa"-0);                           //返回NaN
      alert("100"-0);                              //返回100

对于布尔值来说,parseFloat()方法能够把true转换为1,把false转换为0,而减法运算符视其为NaN。

对于对象来说,parseFloat()方法直接尝试调用对象的toString()方法进行转换,而减法运算符先尝试调用对象的valueOf()方法进行转换,失败之后再调用toString()方法进行转换。

5.3.3 乘法运算

两个正数相乘,则为正数;两个负数相乘,则为正数;一正一反相乘,则为负数。

【示例】特殊运算数的运算结果比较特殊,需要特别留意。

      var n=5;                                   //定义并初始化任意一个数值
      alert(NaN*n);                              //返回NaN。NaN与任意运算数相乘,结果都是NaN
      alert(Infinity*n);                         //返回Infinity。Infinity与任意非0正数相乘,结果都是Infinity
      alert(Infinity * ( - n)); //返回Infinity。Infinity与任意非0负数相乘,结果都是-Infinity,换句话说结果的符号由第二个运算数的符号决定
      alert(Infinity*0);                         //返回NaN。Infinity与0相乘,结果是NaN
      alert(Infinity*Infinity);                  //返回Infinity。Infinity与Infinity相乘,结果是Infinity

5.3.4 除法运算

两个正数相除,则为正数;两个负数相除,则为正数;一正一反相除,则为负数。

【示例】特殊运算数的运算结果比较特殊,需要特别留意。

      var n=5;                               //定义并初始化任意一个数值
      alert(NaN/n);                          //返回NaN。如果某个运算数是NaN,结果都是NaN
      alert(Infinity / n); //返回Infinity。Infinity被任意数字除,结果都是Infinity或-Infinity,符号由第二个运算数的符号决定
      alert(Infinity/Infinity);              //返回NaN
      alert(n / 0); //返回Infinity。0除一个非无穷大的数字,结果是Infinity或-Infinity,符号由第二个运算数的符号决定
      alert(n/-0);                           //返回-Infinity。参考上一行注释说明

5.3.5 余数运算

也称模运算,通俗地说就是求余数。例如:

      alert(3 % 2);                              //返回余数1

模运算主要针对整数执行操作,但是它也适用浮点数,例如:

      alert(3.1 % 2.3);                          //返回余数0.8000000000000003

【示例】特殊运算数的运算结果比较特殊,需要特别留意。

      var n=5;                                   //定义并初始化任意一个数值
      alert(Infinity % n);                       //返回NaN
      alert(Infinity % Infinity);                //返回NaN
      alert(n % Infinity);                       //返回5
      alert(0 % n);                              //返回0
      alert(0 % Infinity);                       //返回0
      alert(n % 0);                              //返回NaN
      alert(Infinity % 0);                       //返回NaN

5.3.6 取反运算

取反运算符是一元运算符,或称一元减法运算符。

【示例】下面列举特殊运算数的取反运算结果。

      alert(-5);                                   //返回-5。正常数值取负数
      alert(-"5");                                 //返回-5。先转换字符串数字为数值类型
      alert(-"a");                                 //返回NaN。无法完全匹配运算,返回NaN
      alert(-Infinity);                            //返回-Infinity
      alert(-(-Infinity));                         //返回Infinity
      alert(-NaN);                                 //返回NaN

提示:与一元减法运算符相对应的还有一个一元加法运算符,在实际开发中,一元加法运算符很少使用,不过可以利用它把非数值型的数字快速地转换为数值型数值。

5.3.7 递增和递减

递增(++)和递减(--)运算就是通过不断加1或减1以实现改变自身值的一种简洁方法。递增运算符和递减运算符是一元运算符,只能够作用于变量、数组元素或对象属性,这是因为在运算过程中会执行赋值运算,赋值运算左侧必须是一个变量、数组元素或对象属性,只有这样赋值才得以实现。

【示例1】下面代码是错误用法:

      alert(4++);                                  //返回错误

下面代码是正确的用法:

      var n = 4;
      alert(n++);                                  //返回4

递增运算符和递减运算符有位置讲究,位置不同所得运算结果也不同。

【示例2】下面递增运算符是先执行赋值运算,然后再执行递加运算。即先计算表达式的返回值,最后才把自身值递加。

      var n = 4;
      alert(n++);                                  //返回4

而下面的递增运算符是先执行递加运算,再返回表达式的值。

      var n = 4;
      alert(++n);                                  //返回5

【示例3】下面代码可以直观演示每个表达式与变量n的值并非都是同步的。

      var n = 4;
      alert(n++);                                  //返回4
      alert(++n);                                  //返回6。在递加之前,变量n的值是5,而不是4

递增运算符和递减运算符是相反操作的一对。它们在运算之前都会试图转换值为数值类型,如果失败则返回NaN。