布爾操作符一共有三個:
非(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