【原生JS教程】第3节:运算符与表达式

👽第 3 课:运算符与表达式

📌 引言

运算符是 JavaScript 中用于操作数据的基本工具,表达式则是由变量、常量、运算符等构成的可求值代码片段。掌握运算符的分类和使用方式,是编写逻辑判断、数据处理和复杂计算的基础。

通过本节课的学习,你将掌握:

  • JavaScript 中常见的运算符类型(算术、比较、逻辑、三元等)
  • 运算符的优先级与结合性
  • 表达式的基本概念与使用场景
  • 常见运算符陷阱与最佳实践

📚 本节内容概要

✅ 1. 算术运算符(Arithmetic Operators)

用于执行数学运算。

运算符描述示例
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/ 除法6 / 32
%取余7 % 31
**幂运算2 ** 38
++自增let a = 5; a++5(后自增)
--自减let b = 5; b--5(后自减)

📌 注意+ 运算符在字符串拼接中具有优先级,例如:

console.log(5 + "5"); // "55"
console.log("5" + 5); // "55"

✅ 2. 比较运算符(Comparison Operators)

用于比较两个值的大小或相等性,返回布尔值(truefalse)。

运算符描述示例
==相等(自动类型转换)5 == "5"true
===严格相等(不转换类型)5 === "5"false
!=不等5 != 3true
!==严格不等5 !== "5"true
>大于5 > 3true
<小于5 < 3false
>=大于等于5 >= 5true
<=小于等于5 <= 3false

📌 最佳实践

  • 优先使用 ===!==,避免因类型转换带来的错误。
  • 避免比较 NaN,使用 Number.isNaN() 替代。

✅ 3. 逻辑运算符(Logical Operators)

用于组合多个布尔表达式。

运算符描述示例
&&逻辑与true && falsefalse
``
!逻辑非!truefalse

📌 短路求值(Short-circuit Evaluation)

  • &&:如果第一个操作数为假值,则返回该值,不再计算第二个。
  • ||:如果第一个操作数为真值,则返回该值,不再计算第二个。
console.log(0 && 5); // 0
console.log(0 || 5); // 5

📌 常见用途

  • || 用于设置默认值:let name = input || "default";
  • && 用于条件执行:isLoggedIn && showProfile();

✅ 4. 条件表达式(三元运算符)

if...else 的简写形式,用于根据条件返回两个值中的一个。

let age = 20;
let result = (age >= 18) ? "成年" : "未成年";
console.log(result); // "成年"

📌 语法

condition ? valueIfTrue : valueIfFalse

✅ 5. 运算符优先级与结合性

JavaScript 中的运算符有优先级顺序,高优先级的运算符会先执行。若优先级相同,则按结合性(左结合或右结合)执行。

优先级运算符结合性
最高()
++, --
!, typeof
*, /, %
+, -
<, >, <=, >=
==, ===
&&
`
最低?:(三元)

📌 建议:使用括号 () 提高可读性,避免优先级问题。

let result = 5 + 3 * 2; // 11(先乘后加)
let result2 = (5 + 3) * 2; // 16(先加后乘)

✅ 6. 表达式(Expressions)

表达式是由变量、常量、运算符等组成的可以求值的代码片段。

常见表达式类型:
  • 算术表达式5 + 3
  • 布尔表达式age > 18
  • 字符串表达式"Hello, " + name
  • 函数表达式function() { return 10; }
  • 对象表达式{ name: "Alice" }
  • 数组表达式[1, 2, 3]

📌 表达式与语句的区别

  • 表达式返回一个值。
  • 语句执行一个操作,不一定返回值(如 ifforwhile)。

✅ 7. 实战练习建议

练习 1:理解 ===== 的区别
console.log(5 == "5");  // true
console.log(5 === "5"); // false

📌 问题:为什么 == 会返回 true=== 为何返回 false

练习 2:使用逻辑运算符设置默认值
function greet(name) {
  name = name || "Guest";
  console.log("Hello, " + name);
}

greet();        // "Hello, Guest"
greet("Alice"); // "Hello, Alice"

📌 问题:如果 name 是空字符串,会发生什么?

练习 3:使用三元运算符简化判断
let score = 85;
let grade = score >= 90 ? "A" : score >= 80 ? "B" : "C";
console.log(grade); // "B"

📌 问题:你能将上述代码改写为 if...else 吗?


🧾 总结

本节课我们系统学习了 JavaScript 中的各类运算符(算术、比较、逻辑、三元),掌握了表达式的基本概念,并理解了运算符的优先级和结合性。通过实战练习,我们加深了对逻辑判断、类型转换和表达式使用的理解。

通过本节课的学习,你已经具备以下能力:

  • 使用算术运算符进行数学计算
  • 使用比较运算符进行逻辑判断
  • 使用逻辑运算符实现短路求值和默认值设置
  • 使用三元运算符简化 if...else 判断
  • 理解运算符优先级与结合性,避免常见陷阱

第 3 课:运算符与表达式 —— 重难点分析与高频面试题


🧠 本节重难点分析

🔑 重点内容

知识点说明
算术运算符掌握 +-*/%**++-- 的使用,理解字符串拼接优先级
比较运算符熟悉 ==(类型转换)与 ===(严格相等)的区别
逻辑运算符掌握 &&(短路返回第一个假值)和 `
条件表达式(三元运算符)理解其作为 if...else 简写形式的用法
运算符优先级了解常见运算符的优先级顺序,避免逻辑错误
表达式与语句的区别表达式返回值,语句执行操作

🧩 难点内容

知识点说明
===== 的行为差异特别是 null == undefinedtrue,而 null === undefinedfalse
+ 运算符的类型转换行为5 + "5" 返回 "55",而 5 - "5" 返回 0
逻辑运算符的“短路”行为0 && 5 返回 0,`0
运算符优先级陷阱5 + 3 * 2(5 + 3) * 2 的差异
三元运算符嵌套的可读性问题嵌套使用可能导致代码难以维护

📌 第 3 课 10 大高频面试题

1. ===== 有什么区别?

答案要点

  • ==:进行类型转换后再比较。
  • ===:不进行类型转换,直接比较类型和值。
console.log(5 == "5");  // true
console.log(5 === "5"); // false

2. null == undefinednull === undefined 的结果分别是什么?

答案要点

  • null == undefinedtrue(类型转换后相同)
  • null === undefinedfalse(类型不同)

3. + 运算符在字符串和数字之间的行为?

答案要点

  • 如果其中一个操作数是字符串,+ 会执行字符串拼接。
  • 其他情况执行加法运算。
console.log(5 + "5"); // "55"
console.log(5 - "5"); // 0

4. 什么是“短路求值”?请举例说明。

答案要点

  • &&:如果第一个操作数为假值,返回该值,不执行后续。
  • ||:如果第一个操作数为真值,返回该值,不执行后续。
console.log(0 && 5); // 0
console.log(0 || 5); // 5

5. ! 运算符的作用是什么?如何判断真假值?

答案要点

  • !:将操作数转换为布尔值后取反。
  • 假值包括:0""nullundefinedNaNfalse
console.log(!""); // true
console.log(!5);  // false

6. ++aa++ 有什么区别?

答案要点

  • ++a:前置自增,先自增再返回值。
  • a++:后置自增,先返回值再自增。
let a = 5;
console.log(++a); // 6
console.log(a++); // 6
console.log(a);   // 7

7. 如何使用三元运算符简化 if...else

答案要点

  • 三元运算符格式为 condition ? valueIfTrue : valueIfFalse
let age = 20;
let result = age >= 18 ? "成年" : "未成年";

8. JavaScript 中哪些运算符的优先级最高?

答案要点

  • 括号 () 最高。
  • 接下来是 ++--!typeof
  • 最低的是 ?:(三元)、=+= 等赋值运算符。
console.log(5 + 3 * 2);     // 11(先乘后加)
console.log((5 + 3) * 2);   // 16(先加后乘)

9. 请解释 0.1 + 0.2 !== 0.3 的原因?

答案要点

  • JavaScript 使用 IEEE 754 浮点数表示法,某些十进制小数无法精确表示,导致精度丢失。
console.log(0.1 + 0.2); // 0.30000000000000004

10. NaNisNaN() 的区别?

答案要点

  • 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...elseswitch 的使用场景
  • forwhiledo...while 的基本结构
  • breakcontinue 的作用
  • 理解 NaNNumber.isNaN() 的区别

📌 预习建议

  • 查阅 MDN 关于 if...elseswitch 的文档
  • 尝试使用 for 循环遍历数组
  • 理解 breakcontinue 的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈前端老曹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值