Skip to content

运算符

JavaScript 运算符用于执行数学、逻辑或赋值等操作,是语言的核心组成部分。以下是运算符的分类及详细解析:

一、算术运算符

用于数值计算,包括基本运算和自增/自减。

运算符名称示例说明
+加法3 + 5 → 8字符串连接时转为字符串拼接。
-减法10 - 4 → 6
*乘法3 * 6 → 18
/除法10 / 2 → 5
%取模(余数)7 % 3 → 1
++自增x++++x后缀形式返回原值,前缀形式返回新值。
--自减x----x同上。

注意

  • 字符串相加会触发类型转换(如 'a' + 1'a1')。
  • 非数值运算会自动转换为数值(如 '123' - 45 → 78)。

二、比较运算符

用于比较值的大小或相等性,返回布尔值。

运算符名称示例说明
==宽松相等5 == '5' → true自动类型转换后比较。
===严格相等5 === '5' → false类型和值都必须相同。
>大于8 > 5 → true
<小于3 < 6 → true
>=大于等于5 >= 5 → true
<=小于等于2 <= 3 → true

特殊情况

  • null == undefined → true,但 null === undefined → false。
  • NaN == NaN → false,需用 isNaN() 检测。
  • 字符串比较按 Unicode 码点排序(如 'apple' > 'banana' → false)。

三、逻辑运算符

用于逻辑判断,支持短路求值。

| 运算符 | 名称 | 示例 | 说明 | | ------ | ------ | -------- | ------------------------------------- | --- | --- | --- | ------------------------------------- | | && | 逻辑与 | a && b | 若 a 为假,返回 a;否则返回 b。 | | | | | 逻辑或 | a | | b | 若 a 为真,返回 a;否则返回 b。 | | ! | 逻辑非 | !a | 转换为布尔值后取反。 |

短路求值

javascript
const x = 0 && "test"; // x → 0(短路,不执行右边)
const y = null || "default"; // y → 'default'

四、赋值运算符

用于给变量赋值,支持复合赋值。

运算符名称示例等价于
=赋值x = 5
+=加等于x += 3x = x + 3
-=减等于y -= 2y = y - 2
*=乘等于z *= 4z = z * 4
/=除等于a /= 5a = a / 5
%=取模等于b %= 3b = b % 3

五、位运算符

直接对二进制位进行操作(较少用于前端)。

| 运算符 | 名称 | 示例 | 说明 | | ------ | -------- | ------------- | ------------------------ | ------ | ------------------------- | | & | 按位与 | 5 & 3 → 1 | 对应位都为 1 时才为 1。 | | | | 按位或 | 5 | 3 → 7 | 对应位有一个为 1 时为 1。 | | ^ | 按位异或 | 5 ^ 3 → 6 | 对应位不同时为 1。 | | ~ | 按位非 | ~5 → -6 | 二进制取反(补码运算)。 | | << | 左移 | 5 << 1 → 10 | 左移一位相当于乘以 2。 | | >> | 右移 | 6 >> 1 → 3 | 右移一位相当于除以 2。 |

六、条件运算符(三元运算符)

用于简化条件判断。

javascript
condition ? exprIfTrue : exprIfFalse;

示例

javascript
const age = 18;
const status = age >= 18 ? "adult" : "minor"; // 'adult'

七、其他运算符

1. 逗号运算符

按顺序执行多个表达式,返回最后一个结果。

javascript
const x = (1 + 2, 3 * 4); // x → 12

2. 点运算符(.)和方括号运算符([]

用于访问对象属性。

javascript
const obj = { a: 1, b: 2 };
console.log(obj.a); // 1
console.log(obj["b"]); // 2

3. new 运算符

创建对象实例。

javascript
const date = new Date();

4. typeof 运算符

返回变量的类型字符串。

javascript
typeof 42'number'
typeof 'hello''string'
typeof null'object'(历史遗留问题)

八、运算符优先级与结合性

优先级决定表达式的执行顺序,结合性决定相同优先级运算符的处理方向。

| 优先级 | 运算符 | 结合性 | | ------ | -------------------- | ------ | --- | ------ | | 1 | .[]() | 左到右 | | 2 | ++--!~ | 右到左 | | 3 | */% | 左到右 | | 4 | +- | 左到右 | | 5 | ><>=<= | 左到右 | | 6 | ===== | 左到右 | | 7 | && | 左到右 | | 8 | | | | 左到右 | | 9 | ? : | 右到左 | | 10 | =+=-=等 | 右到左 |

示例

javascript
3 + 4 * 211(先乘后加)

九、常见面试题

  1. ===== 的区别?

    • == 允许类型转换,=== 严格匹配类型和值。
  2. 为什么 typeof null 返回 'object'

    • 历史设计错误,null 被错误归类为对象类型。
  3. 逻辑运算符的短路行为如何影响性能?

    • 避免在短路右侧执行不必要的计算(如 a && expensiveFunction())。
  4. 如何判断两个对象是否相等?

    • 使用 === 只能比较引用地址,需递归比较属性值或使用 JSON.stringify(有限场景)。

十、最佳实践

  1. 优先使用 === 避免类型转换风险。
  2. 避免在逻辑运算符右侧放置副作用代码(如 a && (b = 5))。
  3. 合理使用条件运算符简化代码,但避免过度嵌套。
  4. 注意运算符优先级,必要时用括号明确执行顺序。

掌握运算符的细节有助于写出高效、无歧义的代码,同时避免常见陷阱。

Released under the MIT License.