逻辑运算符就三个,即与或非
与或非其实非常简单,与运算符就是 &&, 或运算符就是 ||, 非运算符就是 !,完全就是字面意思,与运算符就是两个都为真结果才为真,即 表达式1 && 表达式2,只有两个表达式全都是真,结果才是真。或运算符就是两个里面只要有一个是真,结果就是真,表达式1 || 表达式2,只表达式 1 和表达式 2 里面有一个是真,结果就是真。非运算就是将表达式取反,比如 !表达式1, 若表达式 1 的布尔判定为 true,返回 false,如果是 false 则返回 true。
接下来给出布尔判定的规则,也就是如何来判定表达式是真还是假,其实也就是其他类型转换为布尔类型的规则
- null, undefined, false, NaN,"", 0 均判定为 false
- 其他数据全为真
掌握以上的知识其实已经足够开发了,这里我们需要更加深入。
对于与运算,本质上是在找假,例如 表达式1 && 表达式2 && 表达式3,它会从左到右依次找假,如果表达式 1 的布尔判定为真,就会继续看表达式 2,这样一直找,直到找到一个布尔判定为 false 的值,比如表达式 2 的布尔判定为 false,就会直接把表达式 2 的返回值给返回,如果找到最后都没找到布尔判定为 false 的值,就会返回最后一个表达式的返回值。
这个功能也叫作与短路,在一些情况下很有用
js
a && (b = 2);这个语句的意思是,只有 a 为真的情况下,才会执行 b = 2,这里 a 可以是一个表达式,例如 a > b && (c = 1),这句话就表示当 a>b 的时候,将 c 赋值为 1
练习:
js
var x = 1;
console.log(x > 2 && x++);//false
console.log(x);//1注意,与运算返回值并不一定是布尔类型,比如
true && 200,这个时候返回的应该是 200,比如undefined && 44这个时候返回的应该是 undefined
练习:
js
var x = 1;
console.log(x++ >= 1 && x++ >= 2 && x++ >= 4 && x++ >= 4);
console.log(x);分析这个代码,首先执行 x++ >= 1,这个为 true,并且 x 变为 2,此时继续往后执行 x++ >= 2 ,显然也为 true,并且 x 变为 3,继续执行 x++ >= 4,此时为 false,会将 false 返回,并且 x 变为 4,最后一个 x++ >= 4 不会再执行,所以输出的两个分别是 false 和 4
如果说并且是从前往后找出一个布尔值为 false 的返回,那么或运算就是从前往后找出一个布尔判定为 true 的返回。
js
console.log(1 > 3 || 10);//返回10显然 1>3 为 false,所以往后找,找到 10,进行布尔判定为 true,所以返回 10,这里也是直接返回数据,而非布尔类型。
或运算的这个性质也有一些实际的用处
js
var a = c || 1;这个赋值语句表示,如果 c 的布尔判定为 true,就将 c 赋值给 a,否则就把 a 赋值为 1,相当于是判断 c 有没有值,如果没有值就给 a 一个默认值一样。
非操作就简单很多,就是将值转换为布尔类型,然后取反,非操作不同于与和或,返回值一定是布尔类型。
js
console.log(!true);//false
console.log(!undefined);//true连用两个非操作可以将一个值转换为布尔类型,
!!a就是将变量 a 转换为布尔类型
练习 1:
判断一年是否是闰年
js
var year = 2012;//存放年份
console.log(((year % 4 == 0)&&(year % 100 != 0)) || (year % 400 == 0));能被 4 整除但不能被 100 整除的年份就是闰年,除此之外,如果能被 400 整除,也是闰年
这里有一个小细节,不论哪种编程语言,与运算的优先级都是高于或运算的,因为与运算在逻辑上相当于乘法,或运算在逻辑上相当于加法,乘法的优先级会更高。
练习 2:
判断成绩是否及格
js
var result = 60;//成绩
result >= 60 && console.log("及格");
result < 60 && console.log("不及格");