JavaScript运算符
在本章节中,我们将学习JavaScript的各种运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符等。
1. 什么是运算符?
运算符是用于执行特定数学或逻辑操作的符号。在JavaScript中,运算符可以用于操作变量和值。
根据功能,JavaScript运算符可以分为以下几类:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 一元运算符
- 三元运算符
- 类型运算符
2. 算术运算符
算术运算符用于执行数学运算,如加法、减法、乘法和除法。
| 运算符 | 描述 | 示例 | 结果 |
|---|---|---|---|
| + | 加法 | x + y | x和y的和 |
| - | 减法 | x - y | x和y的差 |
| * | 乘法 | x * y | x和y的积 |
| / | 除法 | x / y | x和y的商 |
| % | 取余(模) | x % y | x除以y的余数 |
| ++ | 自增 | x++或++x | x增加1 |
| -- | 自减 | x--或--x | x减少1 |
2.1 基本算术运算
let x = 10;
let y = 5;
let sum = x + y; // 15
let difference = x - y; // 5
let product = x * y; // 50
let quotient = x / y; // 2
let remainder = x % y; // 02.2 自增和自减运算符
自增(++)和自减(--)运算符用于增加或减少变量的值。它们可以放在变量前面或后面,产生不同的结果。
let x = 10;
let y = 10;
let a = x++; // 先赋值,后自增,a = 10, x = 11
let b = ++y; // 先自增,后赋值,b = 11, y = 11
let c = x--; // 先赋值,后自减,c = 11, x = 10
let d = --y; // 先自减,后赋值,d = 10, y = 103. 赋值运算符
赋值运算符用于给变量赋值。JavaScript提供了多种赋值运算符,可以简写一些常见的操作。
| 运算符 | 描述 | 示例 | 等价于 |
|---|---|---|---|
| = | 简单赋值 | x = y | x = y |
| += | 加后赋值 | x += y | x = x + y |
| -= | 减后赋值 | x -= y | x = x - y |
| *= | 乘后赋值 | x *= y | x = x * y |
| /= | 除后赋值 | x /= y | x = x / y |
| %= | 取余后赋值 | x %= y | x = x % y |
| <<= | 左移后赋值 | x <<= y | x = x << y |
| >>= | 右移后赋值 | x >>= y | x = x >> y |
| >>>= | 无符号右移后赋值 | x >>>= y | x = x >>> y |
| &= | 按位与后赋值 | x &= y | x = x & y |
| ^= | 按位异或后赋值 | x ^= y | x = x ^ y |
| = | 按位或后赋值 | x = y | x = x y |
3.1 赋值运算符示例
let x = 10;
x += 5; // x = x + 5,结果为15
x -= 3; // x = x - 3,结果为12
x *= 2; // x = x * 2,结果为24
x /= 4; // x = x / 4,结果为6
x %= 2; // x = x % 2,结果为04. 比较运算符
比较运算符用于比较两个值,并返回一个布尔值(true或false)。
| 运算符 | 描述 | 示例 |
|---|---|---|
| == | 等于(值比较) | x == y |
| === | 全等(值和类型比较) | x === y |
| != | 不等于(值比较) | x != y |
| !== | 不全等(值和类型比较) | x !== y |
| > | 大于 | x > y |
| < | 小于 | x < y |
| >= | 大于等于 | x >= y |
| <= | 小于等于 | x <= y |
4.1 比较运算符示例
let x = 10;
let y = "10";
console.log(x == y); // true(值相等)
console.log(x === y); // false(类型不同)
console.log(x != y); // false(值相等)
console.log(x !== y); // true(类型不同)
console.log(x > 5); // true
console.log(x < 5); // false
console.log(x >= 10); // true
console.log(x <= 10); // true4.2 == 和 === 的区别
==只比较值是否相等,会进行类型转换===比较值和类型是否都相等,不会进行类型转换
建议在JavaScript中优先使用 ===,避免类型转换带来的意外结果。
5. 逻辑运算符
逻辑运算符用于组合或反转布尔值。
| 运算符 | 描述 | 示例 |
|---|---|---|
| && | 逻辑与 | x && y |
| || | 逻辑或 | x || y |
| ! | 逻辑非 | !x |
5.1 逻辑运算符示例
let x = 10;
let y = 5;
// 逻辑与:两个条件都为true时,结果为true
console.log(x > 5 && y > 2); // true
console.log(x > 15 && y > 2); // false
// 逻辑或:至少有一个条件为true时,结果为true
console.log(x > 15 || y > 2); // true
console.log(x > 15 || y > 10); // false
// 逻辑非:反转布尔值
console.log(!(x > 5)); // false
console.log(!(x > 15)); // true5.2 短路求值
JavaScript的逻辑运算符具有短路求值特性:
- 对于
&&,如果第一个操作数为false,就不会计算第二个操作数 - 对于
||,如果第一个操作数为true,就不会计算第二个操作数
let x = 10;
let y = 0;
// 短路求值:y > 0为false,所以不会执行x++
let result1 = y > 0 && x++;
console.log(x); // 10
// 短路求值:x > 5为true,所以不会执行y++
let result2 = x > 5 || y++;
console.log(y); // 06. 三元运算符
三元运算符(也称为条件运算符)是JavaScript中唯一需要三个操作数的运算符。它用于根据条件返回不同的值。
语法:condition ? expr1 : expr2
- 如果condition为true,返回expr1
- 如果condition为false,返回expr2
6.1 三元运算符示例
let x = 10;
let y = 5;
// 比较x和y,返回较大的值
let max = x > y ? x : y; // 10
// 检查年龄是否满18岁
let age = 20;
let canVote = age >= 18 ? "可以投票" : "不能投票"; // "可以投票"
// 嵌套三元运算符
let score = 85;
let grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 70 ? "C" :
score >= 60 ? "D" : "F"; // "B"7. 类型运算符
类型运算符用于检测变量的类型。
| 运算符 | 描述 | 示例 |
|---|---|---|
| typeof | 返回变量的类型 | typeof x |
| instanceof | 检测对象是否为某个构造函数的实例 | x instanceof Object |
7.1 typeof 运算符
let x = 10;
let y = "Hello";
let z = true;
let a = undefined;
let b = null;
let c = {};
let d = [];
let e = function() {};
console.log(typeof x); // "number"
console.log(typeof y); // "string"
console.log(typeof z); // "boolean"
console.log(typeof a); // "undefined"
console.log(typeof b); // "object"(注意:null的类型是object,这是JavaScript的一个历史bug)
console.log(typeof c); // "object"
console.log(typeof d); // "object"(数组是特殊的对象类型)
console.log(typeof e); // "function"7.2 instanceof 运算符
let obj = {};
let arr = [];
let date = new Date();
console.log(obj instanceof Object); // true
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true(数组是对象的子类)
console.log(date instanceof Date); // true8. 运算符优先级
运算符优先级决定了表达式中运算的执行顺序。优先级高的运算符先执行,优先级低的运算符后执行。
常见运算符的优先级(从高到低):
- 括号
() - 一元运算符
++,--,!,typeof - 乘法、除法、取余
*,/,% - 加法、减法
+,- - 比较运算符
>,<,>=,<= - 相等运算符
==,!=,===,!== - 逻辑与
&& - 逻辑或
|| - 三元运算符
? : - 赋值运算符
=,+=,-=,*=,/=等
8.1 运算符优先级示例
// 先执行乘法,再执行加法
let result1 = 10 + 5 * 2; // 20
// 使用括号改变优先级,先执行加法,再执行乘法
let result2 = (10 + 5) * 2; // 30
// 先执行逻辑非,再执行逻辑与,最后执行逻辑或
let result3 = true || false && !true; // true9. 位运算符
位运算符用于对二进制数进行操作。在JavaScript中,位运算符会将操作数转换为32位整数,然后执行操作。
| 运算符 | 描述 |
|---|---|
| & | 按位与 |
| | | 按位或 |
| ^ | 按位异或 |
| ~ | 按位非 |
| << | 左移 |
| >> | 有符号右移 |
| >>> | 无符号右移 |
9.1 位运算符示例
let x = 5; // 二进制:00000000000000000000000000000101
let y = 3; // 二进制:00000000000000000000000000000011
let andResult = x & y; // 1(二进制:00000000000000000000000000000001)
let orResult = x | y; // 7(二进制:00000000000000000000000000000111)
let xorResult = x ^ y; // 6(二进制:00000000000000000000000000000110)
let notResult = ~x; // -6(二进制:11111111111111111111111111111010)
let leftShiftResult = x << 1; // 10(二进制:00000000000000000000000000001010)
let rightShiftResult = x >> 1; // 2(二进制:00000000000000000000000000000010)10. 常见问题解答
Q: 为什么null的typeof是object?
A: 这是JavaScript的一个历史bug。在JavaScript的早期版本中,null被错误地设计为object类型。这个bug至今没有被修复,因为修复它会破坏大量现有的代码。
Q: 什么时候使用三元运算符?
A: 三元运算符适用于简单的条件判断,可以简化代码。对于复杂的条件判断,建议使用if-else语句,以提高代码的可读性。
Q: 为什么要使用===而不是==?
A: 因为===不会进行类型转换,比较结果更可靠。例如,0 == ""会返回true,这可能不是我们期望的结果,而0 === ""会返回false。
Q: 什么是短路求值?
A: 短路求值是指在逻辑运算中,如果第一个操作数已经可以确定整个表达式的结果,就不会计算第二个操作数。这可以提高代码的执行效率。
11. 练习项目
创建一个HTML文件,包含以下内容:
- 两个输入框,用于输入数字
- 一个下拉菜单,用于选择运算符(+、-、*、/)
- 一个按钮,用于计算结果
- 一个显示结果的区域
使用JavaScript实现以下功能:
- 获取输入框的值和选择的运算符
- 根据运算符执行相应的计算
- 显示计算结果
- 处理可能的错误,如除零错误
测试不同的运算符,确保计算结果正确
12. 小结
- 运算符是用于执行特定数学或逻辑操作的符号
- JavaScript提供了多种运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符等
- 运算符优先级决定了表达式中运算的执行顺序
- 建议优先使用===而不是==,避免类型转换带来的意外结果
- 短路求值可以提高代码的执行效率
- 三元运算符适用于简单的条件判断,可以简化代码
在下一章节中,我们将学习JavaScript表达式和语句的相关知识。