- 文档/教程
- 前端
【免费下载链接】en.javascript.info
Modern JavaScript Tutorial
导读
本文围绕 en.javascript.info(Modern JavaScript Tutorial)中"逻辑运算符"章节的经典练习题"Check the range outside"展开,讲解如何用if条件判断age不在14到90(含边界)区间内,并给出使用 NOT(!)与不使用 NOT 的两种等价写法。读完本文,你将掌握区间边界判断、否定条件的正确展开方式,以及逻辑运算符&&、||、!之间的运算优先级与德摩根定律在实际编码中的应用。
任务还原:题目要求与区间边界
练习题原文位于 7-check-if-out-range/task.md,需求如下:
Write an
ifcondition to check thatageis NOT between14and90inclusively. Create two variants: the first one using NOT!, the second one -- without it.
要点拆解:
- 目标区间是
14 ≤ age ≤ 90,即inclusively(含边界),14和90本身属于"范围内"; - 需要判断的是区间的补集:
age < 14或age > 90; - 必须给出两个变体:变体一使用逻辑非
!(对"区间内"的完整条件取反),变体二不使用!(直接写出否定后的条件)。
这个任务与其姊妹题"Check the range between"(6-check-if-in-range/task.md,要求判断age在14到90含边界之内)互为镜像,非常适合放在一起对照学习。
标准解答:官方给出的两个变体
题目官方解答位于 7-check-if-out-range/solution.md,共两个变体。
变体一:使用 NOT(!)
if (!(age >= 14 && age <= 90))先写出"在区间内"的条件age >= 14 && age <= 90,再用逻辑非!对整个括号表达式取反,表示"不在区间内"。这里括号是必需的,因为!的优先级是所有逻辑运算符中最高的——如果写成!age >= 14,会先对age取布尔非,再与14比较,逻辑完全错误。
变体二:不使用 NOT
if (age < 14 || age > 90)直接把否定条件展开成两个边界外判断的或组合:age小于下界14,或者大于上界90。
两种写法的等价性:德摩根定律
变体一与变体二的等价性正是**德摩根定律(De Morgan's laws)**在 JavaScript 中的直接体现:
!(A && B) ≡ !A || !B !(A || B) ≡ !A && !B将A = (age >= 14)、B = (age <= 90)代入第一条定律:
!(age >= 14 && age <= 90) // 变体一 ≡ !(age >= 14) || !(age <= 90) // 应用德摩根定律 ≡ age < 14 || age > 90 // 比较运算符取反注意对比较表达式取反时,>=变成<,<=变成>,这是双向的:!(a >= b) ≡ a < b,!(a <= b) ≡ a > b。与此同时,区间内部的&&(交集)在取反后必须变为||(并集),而区间边界的比较符方向要翻转——这两步缺一不可。
在语法层面,age < 14 || age > 90之所以能简写为不加括号的形式,是因为在 article.md 中明确的运算符优先级:!的优先级最高,&&高于||,比较运算符又高于逻辑运算符,因此age < 14 || age > 90天然被解析为(age < 14) || (age > 90),无需额外括号。
结合教程章节:本题用到的三个逻辑运算符
本题虽短,却完整覆盖了 逻辑运算符章节 中的三大核心运算:
&&(AND)——用于组合区间内条件
&&在经典布尔逻辑中"两者都为真才返回真"。区间内判断age >= 14 && age <= 90要求两个比较同时成立。&&还具有短路求值特性:从左到右求值,遇到第一个假值即停止并返回它;本题中若age < 14,则age <= 90根本不会被执行。
||(OR)——用于组合区间外条件
||在经典逻辑中"任一为真即返回真"。区间外判断age < 14 || age > 90只要满足任一方向就越界。同样地,||从左到右求值,遇到第一个真值即短路返回:若age < 14已为真,age > 90不再求值。
!(NOT)——对整个条件取反
!是单目运算符,先将其操作数转为布尔值,再返回相反值:!true为false,!0为true(article.md 中明确说明)。变体一正是利用!对"区间内"这一布尔结果取反,得到"区间外"。
边界值与运行验证
inclusively意味着边界14与90必须归属"范围内",因此设计测试用例时应覆盖四个关键区间点:13(下界外)、14(下界,范围内)、90(上界,范围内)、91(上界外),外加一个中间值如50:
| age | age >= 14 && age <= 90 | age < 14 || age > 90 | 结果 |
|---|---|---|---|
| 13 | false | true | 区间外 |
| 14 | true | false | 区间内 |
| 50 | true | false | 区间内 |
| 90 | true | false | 区间内 |
| 91 | false | true | 区间外 |
可以看到,两个变体在所有输入下结果完全一致——这正是等价性的实证。实际运行时,可以将两种写法分别放入if并配合alert输出,验证行为:
let age = 13; // 变体一:使用 NOT if (!(age >= 14 && age <= 90)) { alert('Out of range (variant 1)'); } // 变体二:不使用 NOT if (age < 14 || age > 90) { alert('Out of range (variant 2)'); }对照学习:与"区间内"任务的镜像关系
本题是 6-check-if-in-range 的镜像练习。区间内判断的标准解答为:
if (age >= 14 && age <= 90)(见 6-check-if-in-range/solution.md。)
两题连起来看,区间判断的基本范式可以归纳为:
- 区间内:
if (age >= 下界 && age <= 上界); - 区间外(不用
!):if (age < 下界 || age > 上界); - 区间外(用
!):if (!(age >= 下界 && age <= 上界))。
理解这个镜像关系后,遇到"含边界/不含边界""范围内/范围外"等需求就能直接套用,而不会在边界比较符(>=vs>)上出错。
常见误区与优先级提醒
误区一:省略!后的括号
// 错误示范 if (!age >= 14 && age <= 90)!的优先级最高,先执行!age(结果是布尔值),再与数字14比较,逻辑完全偏离题意。取反一个复合条件时,括号必须保留。
误区二:忘记翻转比较符方向
// 错误示范:只把 && 改成 ||,比较符方向没翻转 if (age >= 14 || age <= 90)这个条件对所有age几乎恒为真(任何数不是>= 14就是<= 90),完全失去了判断意义。取反区间时,>=必须变<,<=必须变>。
误区三:混淆&&与||的优先级
在 8-if-question/task.md 中还有一道综合题,其中null || -1 && 1因&&优先级更高而等价于null || (-1 && 1) = null || 1 = 1(真值),从而执行alert。这提醒我们:当&&与||混用且依赖默认优先级时,代码的可读性会下降。本题变体二age < 14 || age > 90只有同一优先级的两项,无需担心;而变体一中的!(...)括号则明确划定了取反的边界。
误区四:用&&/||替代if的炫技写法
教程在 article.md 中专门警告过:不要用&&或||当"简短的if"来用,例如(x > 0) && alert('...')。虽然能工作,但if意图更明显、可读性更好。区间判断场景下,建议始终使用完整的if语句。
小结
"Check the range outside"虽然只是一个单行练习题,却浓缩了 JavaScript 逻辑运算的多个关键知识点:
- 含边界区间的判断:
age >= 14 && age <= 90; - 取反的正确姿势:
!(age >= 14 && age <= 90),括号不可省略; - 德摩根定律:
!(A && B) ≡ !A || !B,从而得到免!变体age < 14 || age > 90; - 运算符优先级:
!>&&>||,比较运算符高于逻辑运算符; - 边界值意识:
14与90归属范围内,测试时应覆盖13/14/90/91四个关键点。
这两种写法在工程实践中都很常见:语义清晰时用!(...)表达"不属于该范围",追求简洁或与"范围内"分支并列时用展开式。理解它们为什么等价(德摩根定律),比记住写法本身更重要——这正是本练习想训练的能力。
- 文档/教程
- 前端
【免费下载链接】en.javascript.info
Modern JavaScript Tutorial
相关推荐
HAMi 设备支持矩阵与演进路线图:从多厂商异构加速器接入到调度与可观测性规划
HAMi 设备支持矩阵与演进路线图:从多厂商异构加速器接入到调度与可观测性规划 导读 本文以 HAMi 仓库中的 roadmap.md https://link
文档/教程前端Modern JavaScript Tutorial 任务实战:用 JavaScript 编写 min(a, b) 求两数最小值
Modern JavaScript Tutorial 任务实战:用 JavaScript 编写 min a, b 求两数最小值 本篇文章围绕《Modern Ja
文档/教程前端Modern JavaScript Tutorial:深入理解 JavaScript 变量(let / const / var 与命名规范)
Modern JavaScript Tutorial:深入理解 JavaScript 变量(let / const / var 与命名规范) 变量是 JavaS
文档/教程前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考