引言
运算符是 JavaScript 中用于操作数据的基本工具,表达式则是由变量、常量、运算符等构成的可求值代码片段。掌握运算符的分类和使用方式,是编写逻辑判断、数据处理和复杂计算的基础。
通过本节课的学习,你将掌握:
用于执行数学运算。
运算符 | 描述 | 示例 |
---|---|---|
+ |
加法 | 5 + 3 ➜ 8 |
- |
减法 | 5 - 3 ➜ 2 |
* |
乘法 | 5 * 3 ➜ 15 |
/ |
除法 | 6 / 3 ➜ 2 |
% |
取余 | 7 % 3 ➜ 1 |
** |
幂运算 | 2 ** 3 ➜ 8 |
++ |
自增 | let a = 5; a++ ➜ 5 (后自增) |
-- |
自减 | let b = 5; b-- ➜ 5 (后自减) |
注意:+
运算符在字符串拼接中具有优先级,例如:
console.log(5 + "5"); // "55"
console.log("5" + 5); // "55"
用于比较两个值的大小或相等性,返回布尔值(true
或 false
)。
运算符 | 描述 | 示例 |
---|---|---|
== |
相等(自动类型转换) | 5 == "5" ➜ true |
=== |
严格相等(不转换类型) | 5 === "5" ➜ false |
!= |
不等 | 5 != 3 ➜ true |
!== |
严格不等 | 5 !== "5" ➜ true |
> |
大于 | 5 > 3 ➜ true |
< |
小于 | 5 < 3 ➜ false |
>= |
大于等于 | 5 >= 5 ➜ true |
<= |
小于等于 | 5 <= 3 ➜ false |
最佳实践:
===
和 !==
,避免因类型转换带来的错误。NaN
,使用 Number.isNaN()
替代。用于组合多个布尔表达式。
运算符 | 描述 | 示例 |
---|---|---|
&& |
逻辑与 | true && false ➜ false |
` | ` | |
! |
逻辑非 | !true ➜ false |
短路求值(Short-circuit Evaluation):
&&
:如果第一个操作数为假值,则返回该值,不再计算第二个。||
:如果第一个操作数为真值,则返回该值,不再计算第二个。console.log(0 && 5); // 0
console.log(0 || 5); // 5
常见用途:
||
用于设置默认值:let name = input || "default";
&&
用于条件执行:isLoggedIn && showProfile();
是 if...else
的简写形式,用于根据条件返回两个值中的一个。
let age = 20;
let result = (age >= 18) ? "成年" : "未成年";
console.log(result); // "成年"
语法:
condition ? valueIfTrue : valueIfFalse
JavaScript 中的运算符有优先级顺序,高优先级的运算符会先执行。若优先级相同,则按结合性(左结合或右结合)执行。
优先级 | 运算符 | 结合性 |
---|---|---|
最高 | () |
左 |
++ , -- |
右 | |
! , typeof |
右 | |
* , / , % |
左 | |
+ , - |
左 | |
< , > , <= , >= |
左 | |
== , === |
左 | |
&& |
左 | |
` | ||
最低 | ?: (三元) |
右 |
建议:使用括号 ()
提高可读性,避免优先级问题。
let result = 5 + 3 * 2; // 11(先乘后加)
let result2 = (5 + 3) * 2; // 16(先加后乘)
表达式是由变量、常量、运算符等组成的可以求值的代码片段。
5 + 3
age > 18
"Hello, " + name
function() { return 10; }
{ name: "Alice" }
[1, 2, 3]
表达式与语句的区别:
if
、for
、while
)。==
与 ===
的区别console.log(5 == "5"); // true
console.log(5 === "5"); // false
问题:为什么 ==
会返回 true
?===
为何返回 false
?
function greet(name) {
name = name || "Guest";
console.log("Hello, " + name);
}
greet(); // "Hello, Guest"
greet("Alice"); // "Hello, Alice"
问题:如果 name
是空字符串,会发生什么?
let score = 85;
let grade = score >= 90 ? "A" : score >= 80 ? "B" : "C";
console.log(grade); // "B"
问题:你能将上述代码改写为 if...else
吗?
本节课我们系统学习了 JavaScript 中的各类运算符(算术、比较、逻辑、三元),掌握了表达式的基本概念,并理解了运算符的优先级和结合性。通过实战练习,我们加深了对逻辑判断、类型转换和表达式使用的理解。
通过本节课的学习,你已经具备以下能力:
if...else
判断知识点 | 说明 |
---|---|
算术运算符 | 掌握 + 、- 、* 、/ 、% 、** 、++ 、-- 的使用,理解字符串拼接优先级 |
比较运算符 | 熟悉 == (类型转换)与 === (严格相等)的区别 |
逻辑运算符 | 掌握 && (短路返回第一个假值)和 ` |
条件表达式(三元运算符) | 理解其作为 if...else 简写形式的用法 |
运算符优先级 | 了解常见运算符的优先级顺序,避免逻辑错误 |
表达式与语句的区别 | 表达式返回值,语句执行操作 |
知识点 | 说明 |
---|---|
== 与 === 的行为差异 |
特别是 null == undefined 为 true ,而 null === undefined 为 false |
+ 运算符的类型转换行为 |
如 5 + "5" 返回 "55" ,而 5 - "5" 返回 0 |
逻辑运算符的“短路”行为 | 如 0 && 5 返回 0 ,`0 |
运算符优先级陷阱 | 如 5 + 3 * 2 与 (5 + 3) * 2 的差异 |
三元运算符嵌套的可读性问题 | 嵌套使用可能导致代码难以维护 |
==
和 ===
有什么区别?答案要点:
==
:进行类型转换后再比较。===
:不进行类型转换,直接比较类型和值。console.log(5 == "5"); // true
console.log(5 === "5"); // false
null == undefined
和 null === undefined
的结果分别是什么?答案要点:
null == undefined
➜ true
(类型转换后相同)null === undefined
➜ false
(类型不同)+
运算符在字符串和数字之间的行为?答案要点:
+
会执行字符串拼接。console.log(5 + "5"); // "55"
console.log(5 - "5"); // 0
答案要点:
&&
:如果第一个操作数为假值,返回该值,不执行后续。||
:如果第一个操作数为真值,返回该值,不执行后续。console.log(0 && 5); // 0
console.log(0 || 5); // 5
!
运算符的作用是什么?如何判断真假值?答案要点:
!
:将操作数转换为布尔值后取反。0
、""
、null
、undefined
、NaN
、false
。console.log(!""); // true
console.log(!5); // false
++a
和 a++
有什么区别?答案要点:
++a
:前置自增,先自增再返回值。a++
:后置自增,先返回值再自增。let a = 5;
console.log(++a); // 6
console.log(a++); // 6
console.log(a); // 7
if...else
?答案要点:
condition ? valueIfTrue : valueIfFalse
。let age = 20;
let result = age >= 18 ? "成年" : "未成年";
答案要点:
()
最高。++
、--
、!
、typeof
。?:
(三元)、=
、+=
等赋值运算符。console.log(5 + 3 * 2); // 11(先乘后加)
console.log((5 + 3) * 2); // 16(先加后乘)
0.1 + 0.2 !== 0.3
的原因?答案要点:
console.log(0.1 + 0.2); // 0.30000000000000004
NaN
和 isNaN()
的区别?答案要点:
NaN
:表示“非数字”,但其本身是 number
类型。isNaN()
:尝试将参数转换为数字再判断,可能误判(如 isNaN("abc")
返回 true
)。Number.isNaN()
。console.log(isNaN("123")); // false(字符串被转为数字)
console.log(Number.isNaN("123")); // false
console.log(Number.isNaN(NaN)); // true
==
与 ===
的本质区别,避免类型转换带来的错误。+
、&&
、||
的类型转换行为。isNaN()
,使用 Number.isNaN()
更安全。 下一节预告:第 4 课:条件语句与循环
建议复习内容:
if...else
与 switch
的使用场景for
、while
、do...while
的基本结构break
与 continue
的作用NaN
与 Number.isNaN()
的区别预习建议:
if...else
和 switch
的文档for
循环遍历数组break
与 continue
的作用