三、运算符

运算符是一个符号,它使脚本执行特定的数学或逻辑操作。JavaScript 中的运算符可以分为五种类型:算术、赋值、比较、逻辑和按位运算符。

算术运算符

算术运算符包括四种基本算术运算,以及用于获得除法余数的模数运算符(%)。

x = 3 + 2; // 5 - addition

x = 3 - 2; // 1 - subtraction

x = 3 * 2; // 6 - multiplication

x = 3 / 2; // 1.5 - division

x = 3 % 2; // 1 - modulus (division remainder)

赋值运算符

第二组是赋值操作符。最重要的是赋值操作符(=)本身,它给变量赋值。

x = 0; // assignment

组合赋值运算符

赋值运算符和算术运算符的一个常见用途是对变量进行运算,然后将结果保存回同一个变量中。使用组合赋值操作符可以缩短这些操作。

x += 5; // x = x+5;

x -= 5; // x = x-5;

x *= 5; // x = x*5;

x /= 5; // x = x/5;

x %= 5; // x = x%5;

递增和递减运算符

另一种常见的操作是将变量加 1 或减 1。这可以用增量(++)和减量(--)操作符来简化。

x++; // x = x+1;

x--; // x = x-1;

这两者都可以用在变量之前或之后。

x++; // post-increment

x--; // post-decrement

++x; // pre-increment

--x; // pre-decrement

无论使用哪个变量,变量的结果都是相同的。不同的是,后运算符在改变变量之前返回原始值,而前运算符先改变变量,然后返回值。

x = 5; y = x++; // y=5, x=6

x = 5; y = ++x; // y=6, x=6

比较运算符

比较运算符比较两个值,并返回 true 或 false。它们主要用于指定条件,即计算结果为 true 或 false 的表达式。

x = (2 == 3);  // false - equal to

x = (2 === 3); // false - identical

x = (2 !== 3); // true - not identical

x = (2 != 3);  // true - not equal to

x = (2 > 3);   // false - greater than

x = (2 < 3);   // true - less than

x = (2 >= 3);  // false - greater than or equal to

x = (2 <= 3);  // true - less than or equal to

严格相等运算符===!==用于比较类型和值。这些是必要的,因为常规的等于(==)和不等于(!=)操作符会在比较操作数之前自动执行类型转换。

x = (1 == "1");  // true (same value)

x = (1 === "1"); // false (different types)

当不需要等于运算的类型转换功能时,使用严格比较被认为是一种好的做法。

逻辑运算符

逻辑运算符通常与比较运算符一起使用。如果左右两边都为真,则逻辑 and ( &&)计算为真,如果左右两边都为真,则逻辑 or ( ||)为真。对一个布尔结果取反,有一个逻辑非(!)运算符。请注意,对于“逻辑与”和“逻辑或”,如果结果已经由左侧确定,则不会计算右侧。

x = (true && false); // false - logical and

x = (true || false); // true - logical or

x = !(true);         // false - logical not

按位运算符

按位运算符可以处理组成整数的各个位。例如,右移位运算符(>>)将除符号位之外的所有位向右移动,而零填充右移位(>>>)将包括符号位在内的所有位向右移动。这两个运算符对正数的计算是相同的。

x = 5 & 4;  // 101 & 100 = 100 (4) - and

x = 5 | 4;  // 101 | 100 = 101 (5) - or

x = 5 ^ 4;  // 101 ^ 100 = 001 (1) - xor

x = 4 << 1; // 100 << 1 =1000 (8) - left shift

x = 4 >> 1; // 100 >> 1 = 010 (2) - right shift

x = 4 >>>1; // 100 >>> 1 = 010 (2) - zero-fill right shift

x = ∼4;     // ∼00000100 = 11111011 (-5) - invert

按位运算符也有组合赋值运算符。

x=5; x &= 4;  // 101 & 100 = 100 (4) - and

x=5; x |= 4;  // 101 | 100 = 101 (5) - or

x=5; x ^= 4;  // 101 ^ 100 = 001 (1) - xor

x=4; x <<= 1; // 100 << 1 =1000 (8) - left shift

x=4; x >>= 1; // 100 >> 1 = 010 (2) - right shift

x=4; x >>>=1; // 100 >>> 1 = 010 (2) - right shift

请记住,JavaScript 数字存储为双精度浮点数。但是,位运算需要对整数进行操作,因此在执行位运算时,数字会临时转换为 32 位有符号整数。

运算符优先级

在 JavaScript 中,表达式通常从左到右计算。但是,当表达式包含多个运算符时,这些运算符的优先级决定了它们的求值顺序。下表显示了优先级顺序,其中优先级最低的运算符将首先被计算。同样的顺序也适用于许多其他语言,比如 PHP 和 Java。

| 在…之前 | 操作员 | 在…之前 | 操作员 | | --- | --- | --- | --- | | one | () [] . x++ x-- | eight | & | | Two | ! ∼ ++x --x | nine | ^ | | three | * / % | Ten | &#124; | | four | + - | Eleven | && | | five | << >> >>> | Twelve | &#124;&#124; | | six | < <= > >= | Thirteen | = op= | | seven | == != === !=== | Fourteen | , |

举个例子,乘法比加法更难绑定,因此将在下面的代码行中首先进行计算。

x = 4 + 3 * 2; // 10

这可以通过将表达式中首先被求值的部分用括号括起来来说明。从表中可以看出,括号在所有运算符中优先级最低。

x = 4 + (3 * 2); // 10