Cocos2d-x学习笔记:完全掌握JS API与游戏项目开发 (未来书库,触控未来官方教材)
上QQ阅读APP看书,第一时间看更新

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

输出结果:及格