1. 运算符与表达式基础概念
在编程语言中,运算符和表达式是构建程序逻辑的基础砖块。运算符是用来对变量和值执行操作的符号,而表达式则是通过运算符将变量、常量等组合起来形成的有意义的代码片段。
1.1 运算符的分类
运算符可以根据其功能分为以下几大类:
-
算术运算符:用于执行基本数学运算
- 加法(+)
- 减法(-)
- 乘法(*)
- 除法(/)
- 取模(%)
- 自增(++)
- 自减(--)
-
关系运算符:用于比较两个值
- 等于(==)
- 不等于(!=)
- 大于(>)
- 小于(<)
- 大于等于(>=)
- 小于等于(<=)
-
逻辑运算符:用于组合布尔值
- 逻辑与(&&)
- 逻辑或(||)
- 逻辑非(!)
-
位运算符:用于操作二进制位
- 按位与(&)
- 按位或(|)
- 按位异或(^)
- 按位取反(~)
- 左移(<<)
- 右移(>>)
-
赋值运算符:用于给变量赋值
- 简单赋值(=)
- 复合赋值(+=, -=, *=, /=等)
-
条件运算符:三目运算符(?:)
-
特殊运算符:如typeof, instanceof, new等
1.2 表达式的组成
表达式由以下元素组成:
- 操作数(变量、常量、字面量)
- 运算符
- 函数调用
- 属性访问
一个简单的表达式示例:
javascript复制let result = (a + b) * c - d / e;
在这个表达式中:
- a, b, c, d, e是操作数
- +, *, -, /是运算符
- 括号用于改变运算顺序
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 运算符优先级与结合性
2.1 运算符优先级
当表达式中包含多个运算符时,运算符的优先级决定了运算的执行顺序。以下是一些常见运算符的优先级(从高到低):
- 括号(())
- 成员访问(. [])
- 函数调用(())
- 后置递增/递减(++ --)
- 逻辑非(!)、按位非(~)、一元加减(+ -)、前置递增/递减(++ --)、typeof、void、delete
- 乘法(*)、除法(/)、取模(%)
- 加法(+)、减法(-)
- 位移(<< >> >>>)
- 关系(< <= > >=)
- 相等(== != === !==)
- 按位与(&)
- 按位异或(^)
- 按位或(|)
- 逻辑与(&&)
- 逻辑或(||)
- 条件(?:)
- 赋值(= += -=等)
- 逗号(,)
2.2 运算符结合性
当运算符具有相同的优先级时,结合性决定了运算的顺序:
- 左结合(从左到右):大多数运算符,如 +, -, *, / 等
- 右结合(从右到左):赋值运算符、条件运算符、一元运算符等
示例:
javascript复制let a = b = c = 5; // 赋值运算符右结合
let result = 10 - 5 - 2; // 减法运算符左结合
3. 常见运算符详解
3.1 算术运算符
算术运算符用于执行基本数学运算:
javascript复制let a = 10, b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.333...
console.log(a % b); // 1
自增/自减运算符
自增(++)和自减(--)运算符有前置和后置两种形式:
javascript复制let x = 5;
let y = x++; // 后置:先赋值再自增,y=5, x=6
let a = 5;
let b = ++a; // 前置:先自增再赋值,a=6, b=6
3.2 关系运算符
关系运算符用于比较两个值,返回布尔值:
javascript复制console.log(5 > 3); // true
console.log(5 < 3); // false
console.log(5 >= 5); // true
console.log(5 <= 4); // false
相等与严格相等
- ==(相等):比较值,会进行类型转换
- ===(严格相等):比较值和类型,不进行类型转换
javascript复制console.log(5 == "5"); // true
console.log(5 === "5"); // false
console.log(null == undefined); // true
console.log(null === undefined); // false
3.3 逻辑运算符
逻辑运算符用于组合布尔表达式:
javascript复制let a = true, b = false;
console.log(a && b); // false
console.log(a || b); // true
console.log(!a); // false
短路求值
逻辑运算符具有短路特性:
- &&:如果第一个操作数为false,直接返回false,不计算第二个
- ||:如果第一个操作数为true,直接返回true,不计算第二个
javascript复制function test() {
console.log("called");
return true;
}
false && test(); // test()不会被调用
true || test(); // test()不会被调用
3.4 位运算符
位运算符直接操作二进制位:
