运算符
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 | 转换为布尔值后取反。 |
短路求值:
const x = 0 && "test"; // x → 0(短路,不执行右边)
const y = null || "default"; // y → 'default'四、赋值运算符
用于给变量赋值,支持复合赋值。
| 运算符 | 名称 | 示例 | 等价于 |
|---|---|---|---|
= | 赋值 | x = 5 | |
+= | 加等于 | x += 3 | x = x + 3 |
-= | 减等于 | y -= 2 | y = y - 2 |
*= | 乘等于 | z *= 4 | z = z * 4 |
/= | 除等于 | a /= 5 | a = a / 5 |
%= | 取模等于 | b %= 3 | b = 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。 |
六、条件运算符(三元运算符)
用于简化条件判断。
condition ? exprIfTrue : exprIfFalse;示例:
const age = 18;
const status = age >= 18 ? "adult" : "minor"; // 'adult'七、其他运算符
1. 逗号运算符
按顺序执行多个表达式,返回最后一个结果。
const x = (1 + 2, 3 * 4); // x → 122. 点运算符(.)和方括号运算符([])
用于访问对象属性。
const obj = { a: 1, b: 2 };
console.log(obj.a); // 1
console.log(obj["b"]); // 23. new 运算符
创建对象实例。
const date = new Date();4. typeof 运算符
返回变量的类型字符串。
typeof 42 → 'number'
typeof 'hello' → 'string'
typeof null → 'object'(历史遗留问题)八、运算符优先级与结合性
优先级决定表达式的执行顺序,结合性决定相同优先级运算符的处理方向。
| 优先级 | 运算符 | 结合性 | | ------ | -------------------- | ------ | --- | ------ | | 1 | .、[]、() | 左到右 | | 2 | ++、--、!、~ | 右到左 | | 3 | *、/、% | 左到右 | | 4 | +、- | 左到右 | | 5 | >、<、>=、<= | 左到右 | | 6 | ==、=== | 左到右 | | 7 | && | 左到右 | | 8 | | | | 左到右 | | 9 | ? : | 右到左 | | 10 | =、+=、-=等 | 右到左 |
示例:
3 + 4 * 2 → 11(先乘后加)九、常见面试题
==和===的区别?==允许类型转换,===严格匹配类型和值。
为什么
typeof null返回'object'?- 历史设计错误,
null被错误归类为对象类型。
- 历史设计错误,
逻辑运算符的短路行为如何影响性能?
- 避免在短路右侧执行不必要的计算(如
a && expensiveFunction())。
- 避免在短路右侧执行不必要的计算(如
如何判断两个对象是否相等?
- 使用
===只能比较引用地址,需递归比较属性值或使用JSON.stringify(有限场景)。
- 使用
十、最佳实践
- 优先使用
===避免类型转换风险。 - 避免在逻辑运算符右侧放置副作用代码(如
a && (b = 5))。 - 合理使用条件运算符简化代码,但避免过度嵌套。
- 注意运算符优先级,必要时用括号明确执行顺序。
掌握运算符的细节有助于写出高效、无歧义的代码,同时避免常见陷阱。