2.6 运算符
运算符是进行科学计算的标识符。常量、变量和运算符共同组成表达式,表达式是组成程序的基本部分。
2.6.1 算术运算符
JavaScript中的算术运算符用来组织整型和浮点型数据的算术运算。按照参加运算的操作数的不同,算术运算符可以分为一元运算符和二元运算符。
1.一元运算符
一元运算共有3个:-、++和--。-a是对a取反运算。a++或a--是指表达式运算完后,再给a加1或减1。++a或--a是先给a加1或减1,然后进行表达式运算。对一元运算符的说明如表2-1所示。
表2-1 一元算术运算
上述代码第①行-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
上述例子中分别对整型进行了+=、-=、*=、/=和%=运算,对具体语句不再解释。
2.6.2 关系运算符
关系运算是比较两个表达式大小关系的运算,它的结果是真(true)或假(false),即布尔型数据。如果表达式成立则结果为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.6.3 逻辑运算符
逻辑运算符是对布尔型变量进行运算,其结果也是布尔型。对逻辑运算符的说明如表2-5所示。
表2-5 逻辑运算符
&&和‖都具有短路计算的特点。例如,x && y,如果x为false,则不计算y(因为不论y为何值,“与”操作的结果都为false)。例如,x ‖ y,如果x为true,则不计算y(因为不论y为何值,“或”操作的结果都为true)。
所以,我们把&&称为短路与,‖称为短路或的原因,就是它们在计算的过程中就像电路短路一下采用最优化的计算方式,从而提高了效率。
为了进一步理解它们的区别,可以看看下面的例子:
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
其中第①行代码是进行短路或计算,由于(a > b)是true,后面的表达式(i++ == 1)不再计算,因此结果i不会加1,第④行输出的结果为i = 0。如果我们把第①行短路或换成逻辑或,结果则是i = 1。
类似第⑤行代码是进行短路与计算,由于(a < b)是false,后面的表达式(i++ == 1)不再计算,因此结果i不会加1,第⑧行输出的结果为i = 0。如果我们把第⑤行短路与换成逻辑与,结果则是i = 1。
2.6.4 位运算符
位运算是以二进制位(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。
2.6.5 其他运算符
除了前面介绍的主要运算符,还有其他一些运算符,它们包括:
□三元运算符(?:):例如,x?y:z; ,其中x,y和z都为表达式。
□括号:起到改变表达式运算顺序的作用,它的优先级最高。
□引用号(.):调用属性、函数等操作符console.log()。
□赋值号(=):赋值时用等号运算符(=)进行。
□下标运算符[]。
□对象类型判断运算符instanceof。
□内存分配运算符new。
□强制类型转换运算符(类型)。
三元运算符示例:
var score = 80; var result = score > 60 ? "及格" : "不及格"; console.log(result);
输出结果:及格