邏輯運算符通常用於布爾型(邏輯)值;這種情況,它們返回一個布爾型值。然而,&&和||運算符實際上返回一個指定操作數的值,因此這些運算符也用於非布爾型,它們返回一個非布爾型值。
描述EDIT
下面是邏輯運算符的說明:
運算符 | 示例 | 說明 |
---|---|---|
邏輯與 (&& ) |
expr1&&expr2 |
如果expr1 能轉換成false則返回expr1,否則返回expr2. 因此, 在Boolean環境中使用時, 兩個操作結果都為true時返回true,否則返回false. |
邏輯或 (|| ) |
expr1||expr2 |
如果expr1能轉換成true則返回expr1,否則返回expr2. 因此,在boolean環境(在if的條件判斷中)中使用時, 二者操作結果中只要有一個為true,返回true;二者操作結果都為false時返回false. |
邏輯非(! ) |
!expr |
如果單個表達式能轉換為true的話返回false,否則返回true. |
能夠轉換為false的表達式有:null,0,""和undefined.
盡管 &&
和 ||
運算符能夠在非Boolean環境中使用, 但如果他們的返回值能夠轉換成Boolean值的話,也可以認為是Boolean運算.
短路計算
由於邏輯表達式的運算的順序是從左到右,也可以用以下規則進行"短路"計算:
false && (anything)
短路計算的結果為false.true || (anything)
短路計算的結果為 true.
該規則確保這些計算的准確性. 注意如果上述表達式中的 anything 部分不能被計算的話, 兩邊都不會生效.還需要注意的是,上述表達式中的 anything 部分是任意的單個邏輯表達式(小括號中).
下面示例代碼中的兩個函數是相等的.
function shortCircuitEvaluation() {
doSomething() || doSomethingElse()
}
function equivalentEvaluation() {
var flag = doSomething();
if (!flag) {
doSomethingElse();
}
}
但,由於運算符優先級的存在,下面的表達式的結果卻不相同.右側被小括號括起來的操作變成了獨立的表達式.
false && true || true // 結果為 true false && (true || true) // 結果為 false
邏輯與 (&&)
下面的代碼是 && (邏輯與) 運算符的示例.
a1=true && true // t && t 結果為 true
a2=true && false // t && f 結果為 false
a3=false && true // f && t 結果為 false
a4=false && (3 == 4) // f && f 結果為 false
a5="Cat" && "Dog" // t && t 結果為 Dog
a6=false && "Cat" // f && t 結果為 false
a7="Cat" && false // t && f 結果為 false
邏輯或 (||)
下面的代碼是 || (邏輯或) 運算符的示例.
o1=true || true // t || t 結果為 true
o2=false || true // f || t 結果為 true
o3=true || false // t || f 結果為 true
o4=false || (3 == 4) // f || f 結果為 false
o5="Cat" || "Dog" // t || t 結果為 Cat
o6=false || "Cat" // f || t 結果為 Cat
o7="Cat" || false // t || f 結果為 Cat
邏輯非 (!)
下面的代碼是 !
(邏輯非) 運算符的示例.
n1=!true // !t 結果為 false
n2=!false // !f 結果為 true
n3=!"Cat" // !t 結果為 false
轉換規則
將 AND 轉換為 OR
下面涉及到Boolean運算的混合的操作:
bCondition1 && bCondition2
與下面的相等:
!(!bCondition1 || !bCondition2)
將 OR 轉換為 AND
下面涉及到Boolean運算的混合的操作:
bCondition1 || bCondition2
與下面的相等:
!(!bCondition1 && !bCondition2)
刪除嵌套的小括號
由於邏輯表達式是從左往右計算的,所以通常可以按照下面的規則刪除小括號.
刪除嵌套的 AND
下面涉及到Boolean運算的混合的操作:
bCondition1 || (bCondition2 && bCondition3)
與下面的相等:
bCondition1 || bCondition2 && bCondition3
刪除嵌套的 OR
下面涉及到Boolean運算的混合的操作:
bCondition1 && (bCondition2 || bCondition3)
與下面的相等:
!(!bCondition1 || !bCondition2 && !bCondition3)
規范EDIT
規范 | 狀態 | 說明 |
---|---|---|
ECMAScript 1st Edition. | Standard | Initial definition. |
ECMAScript 5.1 (ECMA-262) Logical NOT Operator ECMAScript 5.1 (ECMA-262) Binary Logical Operators |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) Logical NOT operator ECMAScript 2015 (6th Edition, ECMA-262) Binary Logical Operators |
Standard |
瀏覽器兼容性EDIT
向后兼容: 在 JavaScript 1.0 和 1.1 中的表現
&& 和|| 表達式的行為如下:
運算符 | 示例 | 說明 |
---|---|---|
&& |
expr1 &&expr2 |
如果第一個表達式(expr1) 能轉換成false, 那么&& 運算會返回false,而不是expr1的值. |
|| |
expr1 ||expr2 |
如果第一個表達式(expr1) 能轉換成true, 那么|| 運算會返回true,而不是expr1的值. |