布尔操作符一共有三个:
非(NOT)
,与(AND)
,或(OR)
。
1.逻辑非
- 简言之,将任何值转换为一个布尔值,并对其取反,返回结果始终为布尔值。
- 符号表示:
感叹号(!)
- 遵守规则:
1.如果操作数为对象,返回 false
2.如果操作数为字符串,空字符串返回 true;非空返回 false;
3.如果操作数为数值,0 返回 true;任意非 0 数值返回 false;
4.如果操作数是 null,返回 true;
5.如果操作数是 NaN,返回 true;
6.如果操作数是 undefined,返回 true。
💡之前刚了解这些规则时,没有做统一的总结,总会对部分操作数感到疑惑。例如:
!'true'
,!'false'
,!'0'
,等等。归根结底还是,自己没有掌握逻辑非的规则。现在看来,这些没什么好疑问的。
2.逻辑与
- 可以应用于任何类型的操作数,而不仅仅是布尔值。如果其中一个操作数不是布尔值的情况,则不一定返回布尔值。
- 符号表示:
两个和号(&&)
- 真值表:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
- 遵守规则:
逻辑与属于短路操作,这就意味着:
1.如果第一个操作数求值结果为false,就不会对第二个操作数求值,直接返回第一个操作数的值;
2.如果第二个操作数求值结果为true,则返回第二个操作数的值。
- e.g.
/*(对a值求值结果为false,不会继续对b求值,直接返回a的值)*/
var a = null, b = '第二个操作数';
console.log(a && b); // null
a = null; b = undefined;
console.log(a && b); // null
a = 0; b = '第二个操作数';
console.log(a && b); // 0
/*(对a值求值结果为true,继续对b求值,无论求值结果,都直接返回b值)*/
a = []; b = '第二个操作数';
console.log(a && b); // 第二个操作数
a = {}; b = '第二个操作数';
console.log(a && b); // 第二个操作数
a = '第一个操作符'; b = null;
console.log(a && b); // null
3.逻辑或
- 可以应用于任何类型的操作数,而不仅仅是布尔值。如果其中一个操作数不是布尔值的情况,则不一定返回布尔值。
- 符号表示:
两个竖线符号(||)
- 真值表:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
- 遵守规则:
逻辑或属于短路操作,这就意味着:
1.如果第一个操作数求值结果为true,则不会对第二个操作数去求值,直接返回第一个操作数值。
2.如果第一个操作数求值结果返回false,直接返回第二个操作数。
- e.g.
/*(对a求值结果为true,则不对第二个操作数求值,直接返回a值)*/
var a =[], b = '第二个操作数';
console.log(a || b); // []
a ={}; b = undefined;
console.log(a || b); // []
a = '第一个操作数'; b = '第二个操作数';
console.log(a || b); // 第一个操作数
/*(对a求值结果为false,继续对b进行求值,无论求值结果如何,直接返回b值)*/
a = null; b = '第二个操作数';
console.log(a || b); // 第二个操作数
a = undefined; b = null;
console.log(a || b); // null