Modern JavaScript Tutorial 实战:范围外判断的两种等价写法——NOT 变体与德摩根定律
文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载导读本文围绕 en.javascript.infoModern JavaScript Tutorial中逻辑运算符章节的经典练习题Check the range outside展开讲解如何用if条件判断age不在14到90含边界区间内并给出使用 NOT!与不使用 NOT 的两种等价写法。读完本文你将掌握区间边界判断、否定条件的正确展开方式以及逻辑运算符、||、!之间的运算优先级与德摩根定律在实际编码中的应用。任务还原题目要求与区间边界练习题原文位于 7-check-if-out-range/task.md需求如下Write anifcondition 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 between6-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比较逻辑完全错误。变体二不使用 NOTif (age 14 || age 90)直接把否定条件展开成两个边界外判断的或组合age小于下界14或者大于上界90。两种写法的等价性德摩根定律变体一与变体二的等价性正是**德摩根定律De Morgans 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为truearticle.md 中明确说明。变体一正是利用!对区间内这一布尔结果取反得到区间外。边界值与运行验证inclusively意味着边界14与90必须归属范围内因此设计测试用例时应覆盖四个关键区间点13下界外、14下界范围内、90上界范围内、91上界外外加一个中间值如50ageage 14 age 90age 14 || age 90结果13falsetrue区间外14truefalse区间内50truefalse区间内90truefalse区间内91falsetrue区间外可以看到两个变体在所有输入下结果完全一致——这正是等价性的实证。实际运行时可以将两种写法分别放入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.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载相关推荐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文档/教程前端上一篇QMK 中 IS31FL3741 驱动深入解析I²C 39×9 LED 矩阵驱动器的配置、LED 映射与 API 实战下一篇Iosevka 22.0.0 变更深度解析variant selector 重排、西里尔与数学符号扩充及字形修复创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →