购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.4 逻辑运算符

在JavaScript中,逻辑运算符通常用于多个表达式的连接,无论逻辑运算符的左右连接的是什么。表4-4列出了几个常见的逻辑运算符。

表4-4 常见的逻辑运算符

4.4.1 非运算

逻辑非运算符是一个感叹号“!”,它可以将真假值置反。只要在操作数前面加非运算符“!”,不管操作数是何数据类型,都会先转换成布尔类型,再返回一个布尔值。比如:

布尔值true使用非运算符“!”被置换,输出结果为false;布尔值false使用非运算符“!”被置换,输出结果为true。

对于非布尔类型的值,在使用非运算符“!”将值进行置换时,遵循规则:当操作数为对象、非空字符串或非0数值时,返回false;当操作数为空字符串、数值0、null、NaN或undefined时,返回true。

书写下面的代码进行验证:

同时使用两个感叹号“!!”相当于调用了Boolean()。无论操作数是何类型,第一个感叹号使其返回布尔值,第二个感叹号对该布尔值取反,从而得出变量真正对应的布尔值。比如:

4.4.2 且运算

且运算符也被称作与运算符,它是由两个和号“&&”组成的,且两个和号之间不能有空格。使用与运算符时,要将两个表达式分别放在其两边,比如:

当表达式1对应的布尔值为false时,直接返回表达式1的结果,表达式2不被解析。需要注意的是,表达式的结果不仅可以是布尔值,也可以是其他类型的值,只不过在实际开发中布尔值的使用频率较高。

在遇到与运算符“&&”时应进行以下四步操作。

第一步:计算表达式1的值。

第二步:如果这个值对应的布尔值是false,那么直接返回表达式1的值。

第三步:如果这个值对应的布尔值是true,那么计算并返回表达式2的值。

书写测试代码:

比较运算的优先级要高于逻辑运算,因此出现“3大于2,且5小于8”时,是不需要给比较运算加小括号的。比如:

如果要判断变量a是否处于某个区间,如[12,15],则绝对不能使用“连比”,下面的写法是错误的:

变量a的值是6,它明显不在范围[12,15]内,但是代码却返回了true,这是为什么?原因很简单:因为比较运算的优先级要高于逻辑运算,所以实际上先计算的是12<=a得到结果false,再计算false<=15,此处false被隐式转换为0,0<=15的结果是true。

正确判断变量a是否处于某个区间的方法是使用且运算:

4.4.3 或运算

逻辑或运算符是由两个竖线“||”组成的,与运算符且一样,两个竖线之间也不能存在空格。使用或操作符时,要将两个表达式分别放在或操作符的两边,比如:

当表达式1对应的布尔值为true时,不再向下运行,直接返回表达式1的结果;当表达式1对应的布尔值为false时,计算第二个表达式的结果并返回。

在遇到或运算符“||”时应进行以下三步操作。

第一步:计算表达式1的值。

第二步:如果这个值对应的布尔值是true,那么直接返回表达式1的值。

第三步:如果这个值对应的布尔值是false,那么计算并返回表达式2的值。

书写测试代码:

如果逻辑运算很复杂,同时有非、与和或时,则运算优先级依次是:非、与、或。比如:

运行代码后,先执行非运算,即原式变为true||false&&false。然后执行与运算,原式变为true||false。最后输出结果为true。

4.4.4 短路现象

请先思考下面代码的输出结果:

运行代码后,控制台输出的结果为0、1和4。

根据前面对“&&”运算符和“||”运算符的学习,可知当遇到“&&”运算符时,如果其左侧表达式对应的布尔值是false,则直接返回左侧表达式的值,不解析右侧的表达式。在左侧输出中,“a-4”的值为0,对应的布尔值为0,根据规则直接返回左侧表达式的值,故输出结果为0。

当遇到“||”运算符时,如果其左侧表达式的值对应的布尔值为true,则结束运算,直接返回左侧操作数的结果。在左侧输出中,“a-3”的值为1,对应的布尔值为true,根据规则直接返回左侧操作数的结果,故输出结果为1。

你可能会疑惑,在前两个输出语句中,“&&”运算符和“||”运算符的右侧都存在“++a”,为什么最后输出的结果还是4呢?

因为运算符右侧的“++a”表达式都没有被执行,使用的是左侧表达式的结果。这就是本节要讲解的两种短路现象。

短路与“&&”的表现形式是:表达式1&&表达式2,如果左侧表达式对应的布尔值为false,则直接返回表达式1的结果,不执行右侧的表达式2。

短路或“||”的表现形式是:表达式1||表达式2,如果左侧表达式对应的布尔值为true,则直接返回表达式1的结果,不执行右侧的表达式。

简单来说,不管短路与“&&”还是短路或“||”,都是指在一定条件下,不执行右侧表达式,直接使用左侧表达式结果的现象,我们也将这种现象称为“短路现象”。

4.4.5 案例:数轴上的范围表示

学习完逻辑运算符和关系运算符之后,在本节会进行一些逻辑小训练。

请判断变量a是否位于如图4-6所示的数轴上的阴影部分。

图4-6 数轴范围

你可能会想到“3<=a<=7”这样的写法,但是这样书写是错误的:

变量a的值明明是99,但是表达式3<=a<=7的结果竟然是true。这是为什么呢?

当JavaScript面对表达式“3<=a<=7”时,它会从左到右进行计算,即先计算左侧“3<=a”,由于a是99,故表达式“3<=a”的结果是true;然后计算表达式“true<=7”,这里true会被隐式转换为1,故“true<=7”的结果也为true。

综上所述,表达式“3<=a<=7”是一个完全错误的JavaScript表达式,它不能正确地表示数轴上的范围。

如果借助且运算符就很容易实现该需求,代码如下:

表达式“3<=a&&a<=7”的意思直接明了:3小于或等于a,并且a小于或等于7,它能成功判断a是否介于3和7之间。

你可能会担心计算优先级问题,认为要将3<=a和a<=7分别加上括号,代码如下:

虽然这样书写是正确的,但是我们不推荐这种写法。JavaScript在同时面对逻辑运算和关系运算时,会优先进行关系运算,即JavaScript会优先计算3<=a和a<=7,再进行且运算。 Cd8NwAjyqz0sd2Ny7gvt+N+atK8h1Ui64FWL9Pgy6Ii/zOvGj0jrQuE57pHV6DTz

点击中间区域
呼出菜单
上一章
目录
下一章
×