更新時間:2020-10-13 17:24:15 來源:動力節點 瀏覽1167次
對于我們來說,邏輯運算符算是眾多運算符中我們接觸比較早的,所以我們對邏輯運算符的學習其實從中學的物理中就有所體現了。本文我們就帶大家一起重溫經典,回顧邏輯運算符的同時,利于我們更深入的學習。
邏輯運算符一共有以下三個:||(或),&&(與),!(非)。
雖然他們被稱為“邏輯”運算符,但這些運算符卻可以被應用于任意類型的值,而不僅僅是布爾值。他們的結果也同樣可以是任意類型。讓我們來詳細看一下各種邏輯運算符的用法。
一、||(或)
兩個豎線符號表示了“或”運算:
result = a || b;
在傳統的編程中,邏輯或僅能夠操作布爾值。如果參與運算的任意一個參數為 true,返回的結果就為 true,否則返回 false。
在 JavaScript 中,邏輯運算符更加靈活強大。但是首先我們看一下操作數是布爾值的時候發生了什么。
下面是四種可能的邏輯組合:
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
正如我們所見,除了兩個操作數都是 false 的情況,結果都是 true。
如果操作數不是布爾值,那么它將會被轉化為布爾值來參與運算。
例如,數字 1 將會被作為 true,數字 0 則作為 false:
if (1 || 0) { // 工作原理相當于 if( true || false )
alert( 'truthy!' );
}
大多數情況,邏輯或 || 會被用在 if 語句中,用來測試是否有 任何 給定的條件為 true。
例如:
let hour = 9;
if (hour < 10 || hour > 18) {
alert( 'The office is closed.' );
}
我們可以傳入更多的條件:
let hour = 12;
let isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) {
alert( 'The office is closed.' ); // 是周末
}
或運算尋找第一個真值
上文提到的邏輯處理多少有些傳統了。下面讓我們看看 JavaScript 的“附加”特性。
獲取變量列表或者表達式的第一個真值。
假設我們有幾個變量,它們可能包含某些數據或者是 null/undefined。我們需要選出第一個包含數據的變量。
我們可以這樣應用或運算 ||:
let currentUser = null;
let defaultUser = "John";
let name = currentUser || defaultUser || "unnamed";
alert( name ); // 選出了 “John” — 第一個真值
如果 currentUser 和 defaultUser 都是假值,那么結果就是 "unnamed"。
短路取值。
操作數不僅僅可以是值,還可以是任意表達式。或運算會從左到右計算并測試每個操作數。當找到第一個真值,計算就會停止,并返回這個值。這個過程就叫做“短路取值”,因為它盡可能地減少從左到右計算的次數。
當表達式作為第二個參數并且有一定的副作用(side effects),比如變量賦值的時候,短路取值的情況就清楚可見。
如果我們運行下面的例子,x 將不會被賦值:
let x;
true || (x = 1);
alert(x); // undefined,因為 (x = 1) 沒有被執行
如果第一個參數是 false,或運算將會繼續,并計算第二個參數,也就會運行賦值操作。
let x;
false || (x = 1);
alert(x); // 1
賦值操作只是一個很簡單的情況。可能有副作用,如果計算沒有到達,副作用就不會發生。
正如我們所見,這種用法是“if 語句的簡短方式”。第一個操作數被轉化為布爾值,如果是假,那么第二個參數就會被執行。
大多數情況下,最好使用常規的 if 語句,這樣代碼可讀性更高,但是有時候這種方式會很簡潔。
二、&&(與)
兩個 & 符號表示 && 與操作:
result = a && b;
傳統的編程中,當兩個操作數都是真值,與操作返回 true,否則返回 false:
alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false
使用 if 語句的例子:
let hour = 12;
let minute = 30;
if (hour == 12 && minute == 30) {
alert( 'Time is 12:30' );
}
就像或運算一樣,與運算的操作數可以是任意類型的值:
if (1 && 0) { // 作為 true && false 來執行
alert( "won't work, because the result is falsy" );
}
與操作尋找第一個假值
給出多個參加與運算的值:
result = value1 && value2 && value3;
與運算 && 做了如下的事:
從左到右依次計算操作數。
將處理每一個操作數時,都將其轉化為布爾值。如果結果是 false,就停止計算,并返回這個操作數的初始值。
如果所有的操作數都被計算過(也就是,轉換結果都是 true),則返回最后一個操作數。
換句話說,與操作符返回第一個假值,如果沒有假值就返回最后一個值。
上面的規則和或運算很像。區別就是與運算返回第一個假值而或操作返回第一個真值。
例如:
// 如果第一個操作符是真值,
// 與操作返回第二個操作數:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5
// 如果第一個操作符是假值,
// 與操作直接返回它。第二個操作數被忽略
alert( null && 5 ); // null
alert( 0 && "no matter what" ); // 0
我們也可以在一行代碼上串聯多個值。查看第一個假值是否被返回:
alert( 1 && 2 && null && 3 ); // null
如果所有的值都是真值,最后一個值將會被返回:
alert( 1 && 2 && 3 ); // 3,最后一個值
與運算 && 在或操作符 || 之前執行
與運算 && 的優先級比或運算 || 要高。
所以代碼 a && b || c && d 完全跟 && 表達式加了括號一樣:(a && b) || (c && d)。
就像或運算一樣,與運算 && 有時候能夠代替 if。
帶 && 的代碼變體看上去更短。但是 if 的含義更明顯,可讀性也更高。
所以建議是根據目的選擇代碼的結構。需要條件判斷就用 if,需要與運算就用 &&。
三、!(非)
感嘆符號 ! 表示布爾非運算。
語法相當簡單:
result = !value;
操作符接受一個參數,并按如下運作:
將操作數轉化為布爾類型:true/false。
返回相反的值。
例如:
alert( !true ); // false
alert( !0 ); // true
兩個非運算 !! 有時候用來將某個值轉化為布爾類型:
alert( !!"non-empty string" ); // true
alert( !!null ); // false
也就是,第一個非運算將該值轉化為布爾類型并取反,第二個非運算再次取反。最后我們就得到了一個任意值到布爾值的轉化。
有更多詳細的方法可以完成同樣的事 —— 一個內置的 Boolean 函數:
alert( Boolean("non-empty string") ); // true
alert( Boolean(null) ); // false
非運算符 ! 的優先級在所有邏輯運算符里面最高,所以它總是在 && 和 || 前執行。
本文對邏輯運算符的講解已經很透徹了,相信只要你細細品味,花上那么一點時間去思考,就一定能夠完全掌握邏輯運算符的用法。當然,如果你不滿足于此,對Java知識有更多的渴望,可以觀看本站的Java零基礎教程,學習更多的Java基礎知識。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習