news 2026/10/1 9:57:15

Modern JavaScript Tutorial 实战:范围外判断的两种等价写法——NOT 变体与德摩根定律

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Modern JavaScript Tutorial 实战:范围外判断的两种等价写法——NOT 变体与德摩根定律
  • 文档/教程
  • 前端

【免费下载链接】en.javascript.info

Modern JavaScript Tutorial

项目地址:https://gitcode.com/gh_mirrors/en/en.javascript.info
点击查看免费下载

导读

本文围绕 en.javascript.info(Modern 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 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:

ageage >= 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 逻辑运算的多个关键知识点:

  1. 含边界区间的判断:age >= 14 && age <= 90;
  2. 取反的正确姿势:!(age >= 14 && age <= 90),括号不可省略;
  3. 德摩根定律:!(A && B) ≡ !A || !B,从而得到免!变体age < 14 || age > 90;
  4. 运算符优先级:!>&&>||,比较运算符高于逻辑运算符;
  5. 边界值意识:14与90归属范围内,测试时应覆盖13/14/90/91四个关键点。

这两种写法在工程实践中都很常见:语义清晰时用!(...)表达"不属于该范围",追求简洁或与"范围内"分支并列时用展开式。理解它们为什么等价(德摩根定律),比记住写法本身更重要——这正是本练习想训练的能力。

  • 文档/教程
  • 前端

【免费下载链接】en.javascript.info

Modern JavaScript Tutorial

项目地址:https://gitcode.com/gh_mirrors/en/en.javascript.info
点击查看免费下载
上一篇:QMK 中 IS31FL3741 驱动深入解析:I²C 39×9 LED 矩阵驱动器的配置、LED 映射与 API 实战
下一篇:Iosevka 22.0.0 变更深度解析:variant selector 重排、西里尔与数学符号扩充及字形修复

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 9:56:22

EP_无人机机巢的参数和米定位、对比

EP&#xff1a;Engineering and Project 当前无人机的机场的配置存在两个等级&#xff1a;一、高配&#xff0c;全天候&#xff0c;全适应&#xff1b;二、减配&#xff0c;提高出勤条件、降低出勤效率。而当前大疆无人机机场和道通无人机机巢正是这两类的典型代表&#xff0c;…

作者头像 李华
网站建设 2026/10/1 9:55:25

华为昇腾960超节点:破解十万亿参数大模型的万卡协同难题

1. 十万亿参数的算力账&#xff0c;先算到"绝望" 1.1 训练百万亿参数模型到底需要多少计算量 大模型这条赛道&#xff0c;这两年已经从"能不能训"卷到"能训多大"&#xff0c;再卷到"怎么高效训完"。十万亿参数&#xff0c;纸面上看是…

作者头像 李华
网站建设 2026/10/1 9:55:13

从零开发MCP服务器:让AI自动处理Excel的完整指南

最近很多朋友问我&#xff1a;MCP到底是个什么东西&#xff1f;网上教程一堆&#xff0c;但看完还是不知道从哪下手。我的建议从来都是&#xff1a;别去背概念&#xff0c;直接做一个自己天天用得上的小工具。我选的场景就是Excel——每天都要处理表格&#xff0c;报表、数据清…

作者头像 李华
网站建设 2026/10/1 9:50:10

LAMMPS实现蒙脱石壁面页岩油CO₂驱替分子模拟全流程:从建模到后处理

一、行业背景与模拟价值 页岩油作为非常规油气资源的核心,其高效开发是能源领域的研究热点。CO₂驱替技术因能同时实现页岩油采收率提升与碳封存,成为行业重点方向。蒙脱土是页岩储层的核心黏土矿物,其纳米级孔道结构、表面性质直接影响油相运移和CO₂驱替效率。 分子动力…

作者头像 李华
网站建设 2026/10/1 9:49:39

DeepFace 架构全解:从 Public API 到外部集成的五层组件体系

人工智能计算机视觉深度学习 【免费下载链接】deepface A Lightweight Face Recognition and Facial Attribute Analysis (Age, Gender, Emotion and Race) Library for Python 项目地址&#xff1a; https://gitcode.com/GitHub_Trending/de/deepface 点击查看 免费下载 本文…

作者头像 李华
网站建设 2026/10/1 9:47:55

编译原理NFA转DFA的Python实现:子集构造法全解析

简介&#xff1a;一份面向编译原理课程实验的NFA转DFA实现资源&#xff0c;使用Python完成了子集构造法的编码与验证。资源包含三个文件&#xff1a;Python脚本负责状态集合的生成与转移表的构建&#xff0c;NFA文本文件提供描述状态和转移规则的自动机输入样例&#xff0c;实验…

作者头像 李华