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');
很高兴,通过。三元运算符是这么工作的,它分为三个部分:
-
graduateStudent ?
处理第一个变量值,问是否为研究生;
-
'pass' :
处理第二个变量,是研究生的话赋值 pass
-
'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);
布尔值逻辑判断短路还有其它的机制或用途,这里就不展开讨论了。
总而言之,逻辑判断主要就是以上讨论的这些:“与”、“或”、“非”和“三元”。绝大多数情形下使用它们应该都会很简单,特殊情况下有时会很烧脑——但只要真正实践过,一切都将会非常明晰。