运算符是进行科学计算的标识符,常量、变量和运算符组成表达式,表达式是组成程序的基本部分。
JavaScript中的算术运算符用来进行整型和浮点型数据的算术运算,按照参加运算的操作数的不同可以分为一元运算符和二元运算符。
1.一元运算符
一元运算符一共有三个,即-、++和--。-a是对a取反运算,a++或a--是指表达式运算完后,再给a加1或减1。而++a或--a是先给a加1或减1,然后进行表达式运算。一元运算符说明如表2-1所示。
表2-1 一元运算符2
下面看一个一元算术运算符示例:
var a=12; console.log(-a); ① var b=a++; ② console.log(b); b=++a; ③ console.log(b);
输出结果如下:
-12 12 14
上述代码第①行-a是把a变量取反,结果输出是-12。第②行代码是把a++赋值给b变量,a是先赋值后++,因此输出结果是12。第③行代码是把++a赋值给b变量,a是先++后赋值,因此输出结果是14。
2.二元运算符
二元运算符包括+、-、*、/和%,这些运算符对整型和浮点型数据都有效。二元运算符说明如表2-2所示。
表2-2 二元运算符
下面看一个二元算术运算符示例:
//声明一个整型变量 var intResult=1 + 2; console.log(intResult); intResult=intResult - 1; console.log(intResult); intResult=intResult * 2; console.log(intResult); intResult=intResult / 2; console.log(intResult); intResult=intResult + 8; intResult=intResult % 7; console.log(intResult); console.log("-------"); //声明一个浮点型变量 var doubleResult=10.0; console.log(doubleResult); doubleResult=doubleResult - 1; console.log(doubleResult); doubleResult=doubleResult * 2; console.log(doubleResult); doubleResult=doubleResult / 2; console.log(doubleResult); doubleResult=doubleResult + 8; doubleResult=doubleResult % 7; console.log(doubleResult);
输出结果如下:
3 2 4 2 3 ------- 10.0 9.0 18.0 9.0 3.0
上述例子中分别对整型和浮点型进行二元运算,具体语句不再解释。
3.算术赋值运算符
算术赋值运算符只是一种简写,一般用于变量自身的变化。算术赋值运算符说明如表2-3所示。
表2-3 算术赋值运算符
下面看一个算术赋值运算符示例:
var a=1; var b=2; a +=b; //相当于 a=a + b console.log(a); a +=b + 3; //相当于 a=a + b + 3 console.log(a); a -=b; //相当于 a=a - b console.log(a); a *=b; //相当于 a=a*b console.log(a); a /=b; //相当于 a=a/b console.log(a); a %=b; //相当于 a=a%b console.log(a);
输出结果如下:
3 8 6 12 6 0
上述例子中分别对整型进行+=、-=、*=、/=和%=运算,具体语句不再解释。
关系运算是比较两个表达式大小关系的运算,它的结果是真(true)或假(false),即布尔型数据。如果表达式成立,则结果为“真”,否则为“假”。关系运算符有8种:==、!=、>、<、>=、<=、===和!==。关系运算符说明如表2-4所述。
表2-4 关系运算符
下面看一个关系运算符示例:
var value1=1; var value2=2; if (value1==value2) { console.log("value1==value2"); } if (value1 > !=value2) { console.log("value1 > !=value2"); } if (value1 < value2) { console.log("value1 < value2"); } if (value1 < value2) { console.log("value1 < value2"); } if (value1 < =value2) { console.log("value1 < =value2"); } var a=3; var b="3"; //改为3 表达式a===b为true if (a==b) { ① console.log("a==b"); } if (a===b) { ② console.log("a===b"); }
输出结果如下:
value1 !=value2 value1 < value2 value1 < =value2 a==b
上述例子重点解释有标号行代码,其中第①行是通过“==”比较数值a和字符串b是否相等,结果是相等的。同样使用“===”比较数值a和字符串b是否相等,如第②行代码所示,结果是不等的。
逻辑运算符是对布尔型变量进行运算,其结果也是布尔型。逻辑运算符说明如表2-5所示。
&&和‖都具有短路计算特点。例如:x && y,如果x为假,则不计算y(因为不论y为何值,“与”操作的结果都为假)。例如:x ‖ y,如果x为真,则不计算y(因为不论y为何值,“或”操作的结果都为真)。
所以,把&&称为短路与,‖称为短路或,就是它们在计算的过程中就像电路短路一样,采用最优化的计算方式,从而提高了效率。
为了进一步理解它们的区别,看看下面的例子:
var i=0; var a=10; var b=9; if ((a > b) ‖ (i++==1)) {//换成 | 试一下 ① console.log("或运算为真"); ② } else { console.log("或运算为假"); ③ } console.log("i=" + i); ④ i=0; if ((a < b) && (i++==1)) {//换成&试一下 ⑤ console.log("或运算为真"); ⑥ } else { console.log("或运算为假"); ⑦ } console.log("i=" + i); ⑧上述代码运行输出结果如下: 或运算为真 i=0 与运算为假 i=0
上述代码运行输出结果如下:
或运算为真 i=0 与运算为假 i=0
其中,第①行代码是进行短路或计算,由于(a > b)是真,后面的表达式(i++==1)不再计算,因此结果i不会加1,第④行输出的结果为i=0。如果把第①行短路或换成逻辑或,结果则是i=1。
类似地第⑤行代码是进行短路与计算,由于(a < b)是假,后面的表达式(i++==1)不再计算,因此结果i不会加1,第⑧行输出的结果为i=0。如果把第⑤行短路与换成逻辑与,结果则是i=1。
位运算是以二进位(bit)为单位进行运算的,操作数和结果都是整型数据。位运算符有如下几个:&、|、^、~、>>、>>>、<<。位运算符说明如表2-6所示。
表2-6 位运算符
为了进一步理解它们,看看下面的例子:
var a=178; //二进制10110010 var b=94; //二进制01011110 console.log("a | b=" + (a | b)); //二进制11111110 console.log("a & b=" + (a & b)); //二进制00010010 console.log("a ^ b=" + (a ^ b)); //二进制11101100 console.log("~a=" + (~a)); //二进制11111111 11111111 11111111 01001101,十进制 -179① console.log("a >> 2=" + (a >> 2)); //二进制00101100 console.log("a >>> 2=" + (a >>> 2)); //二进制00101100 console.log("a << 2=" + (a << 2)); //二进制11001000 var c=-12; //二进制-1100 console.log("c >> 2=" + (c >> 2)); //二进制-00000011 console.log("c >>> 2=" + (c >>> 2)); //十进制1073741821 ② console.log("c << 2=" + (c << 2)); //二进制-00110000
输出结果如下:
a | b=254 a & b=18 a ^ b=236 ~a=-179 a >> 2=44 a >>> 2=44 a << 2=712 c >> 2=-3 c >>> 2=1073741821 c << 2=-48
上述代码第①行是对a变量取反,178(32位十进制)取反后的二进制表示为11111111 11111111 11111111 01001101。二进制11111111 11111111 11111111 01001101是-179(32位十进制)补码表示。
提示 十进制负数使用二进制补码表示时,补码=反码+1,但这些计算都是二进制位运算。例如-12(32位十进制)补码表示为11111111 11111111 11111111 11110100,计算过程是12(二进制1100)取反表示为11111111 11111111 11111111 11110011,然后+1结果就是11111111 11111111 11111111 11110100。
第②行代码是-12无符号右移2位,-12的补码表示方式是11111111 11111111 11111111 11110100,无符号右移2位,高位采用0补位,结果是00111111 11111111 11111111 11111101,十进制表示为1073741821。
除了前面介绍的主要的运算符,还有其他一些运算符,它们包括:
(1)三元运算符(? :):例如,x?y:z; ,其中x、y和z都为表达式。
(2)括号:起到改变表达式运算顺序的作用,它的优先级最高。
(3)引用号(.):调用属性、函数等操作符console.log()。
(4)赋值号(=):赋值是用等号运算符(=)进行的。
(5)下标运算符[]。
(6)对象类型判断运算符instanceof。
(7)内存分配运算符new。
三元运算符示例:
var score=80; var result=score > 60 ? "及格" : "不及格"; console.log(result);
输出结果:
及格