找回密码
 立即注册
搜索
查看: 7|回复: 0

布尔值与逻辑判断 转自《马黑教程》

[复制链接]

1194

主题

2897

回帖

1万

积分

管理员

积分
11010
发表于 昨天 22:20 | 显示全部楼层 |阅读模式
https://www.huachaowang.com/forum.php?mod=viewthread&tid=90811&extra=

1️⃣布尔值 布尔值(Boolen)是计算机科学中的一种 数据类型 ,通常用于表示真(True)或假(False)。 布尔值的值非真即假,是对开关开或关两种状态的严格模拟,在编程实践中常用来做逻辑判断。例如,小军同学报名参军,计算机程序根据其年龄进行判断是否符合报名条件,布尔值这个时候就能用上。我们假设报名年龄规定如下:
年龄大于等于18周岁且小于等于22周岁
……(还有其他条件)  
计算机如何就上述规定做出判断呢?假设小军年报填的年龄是17.5岁,则年龄小于18岁,布尔值为假,不符合报名条件;如果填的是19岁整,则年龄大于17岁且不突破最大年龄,布尔值为真,符合报名条件;如果填写的年龄是23周岁,则突破了22岁的最大年龄规定,就普通公民而言不能报名。 这里面涉及到了复合性的条件判断,所以需要用到逻辑判断的“与”、“或”、“非”。

2️⃣逻辑判断 基于真假两种状态做出的判断叫逻辑判断。好比电灯的开关,如果开关的状态为开则灯亮,反之则灯不亮。以JS为例,它这么操作: if (switch === 'on') {
    lights = 'on';
} else {
    lights = 'off';
} switch 是我们假定的开关名称,这叫自定义变量,lights一样是个变量,代表灯,开关的开、灯亮的状态用字符串值 'on' 表示,'off' 表示关。 if ... else ... 是判断流程语句,“如果……否则……”之意;if 后面是一个放在小括号 () 里的表达式,语句 switch === 'on' 是“开关开”的意思,三个等号 === 表示严格等于。表达式 switch === 'on' 如果成立(布尔值为true), lights = 'on',即灯亮,语句放在一组花括号 {} 内,反之, lights='off'`,灯灭,语句也要放在花括号内。 开关的开和关影响灯的亮灭是简单的逻辑判断,条件单一,仅凭布尔值的真、假状态便可实现。现在我们回到小军参军的年龄判断问题:由于年龄有上下边界设定,在对年龄是否符合报名条件时需要使用复合式条件,试看: if (age >= 18 && age <= 22) {
    console.log('pass'); // 通过
} else {
    console.log('no pass'); // 不通过
} 条件表达式 (age >= 18 && age <= 22) 例的 && 是 and(与)的意思,它用来粘连两个子表示式, age >= 18 和 age <= 22 ,表示这两个子表达式必须同时成立。这叫“ 逻辑与 ”,&& 等于 and,原意“和”,这里称为“与”,即 逻辑与 。 “ 逻辑或 ”用 || 表示,or(或者)的意思。现在假设小军的年龄为23岁,他之所以报名因为他是在读大学生或者是研究生,参军年龄规定中有放宽政策:对在读大学生可以放宽到24岁、在读研究生可以放宽到26岁。这时,仅针对年龄大于22周岁而言, 逻辑或 用上: // 外层条件:处理22~24岁年龄段,用逻辑与
if (age >= 22 && age <= 24) {
    // 里层条件:判断是大学生或研究生,用逻辑或
    if (collegeStudent || graduateStudent) {
        console.log('pass');
    } else {
        console.log('no pass');
    }
} 在 22~24 这个年龄段,如果身份为在读大学生或是在读或已毕业研究生都可以报名。里层条件语句针对身份做判断,两条用 || 黏连起来的子条件语句只要有一条成立,复合表达式整体布尔值就会为真(true),可以报名,两条子表达式都为假则整体表达式布尔值为假,不能报名。PS:两条子表达式都为真的情形会存在,若此,条件自然也成立。 逻辑与 和 逻辑或 在一些特殊的情形下会出现“互换”状态,就是说,要想表达实际意义的逻辑与或逻辑或,你得用相反的符号: // 假设小军是研究生
let collegeStudent = false, graduateStudent = true;
// 外层条件:处理22~24岁年龄段,用逻辑与
if (age >= 22 && age <= 24) {
    // 里层条件:判断是大学生或研究生,本质逻辑或的写成逻辑与
    if (!collegeStudent && !graduateStudent) {
        console.log('no pass');
    } else {
        console.log('pass');
    }
} 里层判断两个子表达式使用了布尔值反转(!)附,表示否定, !collegeStudent 意为非在读大学生, !graduateStudent 意为非研究生,类似的, !== 表示不等于,是否定状态的逻辑表达式,这时的复合表达式的粘连符号,表示“或者”时使用 && ,表示“与”时使用 || ,和普通情形的使用恰恰相反。 而符号 ! 则为 逻辑非 的前导词或叫关键字,它用在布尔变量或单、双等号的前面,用来否定不是、不等于,等同于将布尔属性值进行意义反转。 参与逻辑判断的关键字还有一个叫 三元运算符 ,它可以对三个值进行操作。例如,已知小军的年龄超过普通公民报名参军的最大年龄限制(现在我们假设它的年龄是25周岁),但他是研究毕业生,现在我们用三元运算符来判断他能否报名参军: let age = 25, graduateStudent = true; // 25岁、研究生
console.log(graduateStudent ? 'pass' : 'no pass'); 很高兴,通过。三元运算符是这么工作的,它分为三个部分: 1. graduateStudent ? 处理第一个变量值,问是否为研究生; 2. 'pass' : 处理第二个变量,是研究生的话赋值 pass 3. 'no pass' ,处理第三个变量,不是研究生的话赋值 no pass  就是说,问号 ? 问前面的变量是否为真,若是,取其后面的值,冒号 : 表示否则,否则的话,则取其后值。 逻辑判断主要就是以上讨论的这些:“与”、“或”、“非”、“三元”。绝大多数情形下使用它们会应该很简单,特殊情况下有时会很烧脑。但只要真正实践过,一切都将会非常明晰。# 布尔值与逻辑判断

3️⃣逻辑运算符的短路机制 逻辑运算符还可以用于短路设计,使得实现某种功能的代码更简洁而优雅。想象一下小军在填表时可能漏填了某个细节项目,例如忘记了填写或因为不是在校大学生而没有勾选“是否是在读大学生”栏目,此种情形,程序判断为不是在读大学生: let collegeStudent = chkIsCollegeStudent.checked && true;
console.log(collegeStudent); chkIsCollegeStudent 是一个复选框,如果勾选,则表达式 chkIsCollegeStudent.checked = true ,不勾选值为 false;上述语句,使用 逻辑与 关键字 && 表示短路:若复选框勾选,则返回 true(反之会返回false)。使 逻辑或 也可以打到相同的效果: let collegeStudent = chkIsCollegeStudent.checked || false;
console.log(collegeStudent); 布尔值逻辑判断短路还有其它的机制或用途,这里就不展开讨论了。 总而言之,逻辑判断主要就是以上讨论的这些:“与”、“或”、“非”和“三元”。绝大多数情形下使用它们应该都会很简单,特殊情况下有时会很烧脑——但只要真正实践过,一切都将会非常明晰。
花潮论坛马黑教程专辑https://www.huachaowang.com/forum.php?mod=viewthread&tid=90288&pid=2512305&page=1&extra=#pid2512305
马黑博客:https://mahei.ccccocccc.cc/




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

协同嘉业科技有限公司 ( 京ICP备2024053108号-1 )

GMT+8, 2026-2-22 06:50 , Processed in 0.109625 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表