1 概述
JavaScript 提供了10种算术运算符,用来完成基本的算术运算。
- 加法运算符:x + y
- 减法运算符: x - y
- 乘法运算符: x * y
- 除法运算符:x / y
- 指数运算符:x ** y
- 余数运算符:x % y
- 自增运算符:++ x 或者 x ++
- 自减运算符:–x 或者 x–
- 数值运算符: +x
- 负数值运算符:-x
这些运算符的使用方法和其它语言的差不多,本文只介绍几处有用的重点。
2 加法运算符
加法运算符(+)一般用来求两个数值的和。如果是两个字符串相加,将会把两个字符串连接在一起。
1 + 2 // 3
true + true // 2
1 + 'a' // "1a"
'a' + 'bc' // "abc"
加法运算符到底是执行相加,还是执行连接,是根据不同的运算子在运行时决定的。
'1' + 2 + 3 // "123"
1 + 2 + '3' // '33'
上面代码中,由于从左到右的运算次序,产生不同的执行结果。
3 指数运算符
指数运算符(**)完成指数运算,前一个运算子是底数,后一个运算子是指数。
2 ** 4 // 16
// 相当于 2 ** (3 ** 2)
2 ** 3 ** 2 // 512
注意,指数运算符是右结合,而不是左结合。
4 或运算符(||)
或运算符常用于为一个变量设置默认值。
function saveText(text) {
text = text || '';
// ...
}
// 或者写成
saveText(this.text || '')
上面代码表示,如果函数调用时,没有提供参数,则该参数默认设置为空字符串。
5 位运算符
前面介绍过,JavaScript内部的数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。
二进制或运算(|)
i = i | 0;
上面这行代码,就是将i(不管是整数或小数)转为32位整数。
利用这个特性,可以写出一个函数,将任意数值转为32位整数。
function toInt32(x) {
return x | 0;
}
toInt32(1.001) // 1
toInt32(-9.999) // -9
上面这个函数将任意值与0进行一次或运算,这个位运算会自动将一个值转为32位整数。
二进制否运算符(~)
否运算符(~)将每个二进制位都变为相反值(0变为1,1变为0)。
对一个整数连续两次二进制否运算,得到它自身。
~~3 // 3
因为所有的位运算都只对整数有效。二进制否运算遇到小数时,也会将小数部分舍去,只保留整数部分。所以,对一个小数连续进行两次二进制否运算,能达到取整效果。
~~2.9 // 2
~~47.11 // 47
~~1.9999 // 1
~~3 // 3
使用二进制否运算取整,是所有取整方法中最快的一种。
异或运算符(^)
异或运算(^)在两个二进制位不同时返回1,相同时返回0。
0 ^ 3 // 3
上面表达式中,0(二进制00)与3(二进制11)进行异或运算,它们每一个二进制位都不同,所以得到11(即3)。
“异或运算”有一个特殊运用,连续对两个数a和b进行三次异或运算,a^=b; b^=a; a^=b;,可以互换它们的值。这意味着,使用“异或运算”可以在不引入临时变量的前提下,互换两个变量的值。
var a = 10;
var b = 99;
a ^= b, b ^= a, a ^= b;
a // 99
b // 10
这是互换两个变量的值的最快方法。
异或运算也可以用来取整。
9.99 ^ 0 // 9