一、&&和||的簡單介紹
1伺通、&&(邏輯與)
邏輯與操作符由兩個和號(&&)表示箍土。
2、||(邏輯或)
邏輯或操作符由兩個管道符(||)表示罐监。
二涮帘、深入理解&&和||
1、用法
&& 和 || 運算符的返回值并不一定是布爾類型笑诅,而是兩個操作數(shù)其中一個的值调缨。例如:
var a = 42;
var b = "abc";
var c = null;
a || b; // 42
a && b; // "abc"
c || b; // "abc"
c && b; // null
1) || 和 && 首先會對第一個操作數(shù)(a 和 c)執(zhí)行條件判斷,如果其不是布爾值(如上例)就先進行ToBoolean 強制類型轉換吆你,然后再執(zhí)行條件判斷弦叶。
2)對于 ||來說,如果條件判斷結果為 true就返回第一個操作數(shù)(a 和 c)的值妇多,如果為false 就返回第二個操作數(shù)(b)的值伤哺。
3)&&則相反,如果條件判斷結果為 true 就返回第二個操作數(shù)(b)的值者祖,如果為 false 就返回第一個操作數(shù)(a 和 c)的值立莉。
4)|| 和 && 返回它們其中一個操作數(shù)的值,而非條件判斷的結果(其中可能涉及強制類型轉換)七问。c && b 中 c 為 null蜓耻,是一個假值,因此 && 表達式的結果是 null(即 c 的值)械巡,而非條件判斷的結果 false刹淌。
2、亦可換種角度來理解(有一個細微的差別):
a || b;
// 大致相當于(roughly equivalent to):
a ? a : b;
a && b;
// 大致相當于(roughly equivalent to):
a ? b : a;
3讥耗、十分常見的||用法如下:
function foo(a,b) {
a = a || "hello";
b = b || "world";
console.log( a + " " + b );
}
foo(); // "hello world"
foo( "yeah", "yeah!" ); // "yeah yeah!"
a = a || "hello"(又稱為 C# 的“空值合并運算符”的 JavaScript 版本)檢查變量 a有勾,如果還未賦值(或者為假值),就賦予它一個默認值("hello")古程。
4蔼卡、再來看看 &&:
function foo() {
console.log( a );
}
var a = 42;
a && foo(); // 42
foo() 只有在條件判斷 a 通過時才會被調用。如果條件判斷未通過挣磨,a && foo() 就會悄然終止(也叫作“短路”雇逞,short circuiting)荤懂,foo() 不會被調用。
5喝峦、注意:
你大概會有疑問:既然返回的不是 true 和 false,為什么 a && (b || c) 這樣的表達式在if 和 for 中沒出過問題呜达?
這或許并不是代碼的問題谣蠢,問題在于這些條件判斷表達式最后還會執(zhí)行布爾值的隱式強制類型轉換。
例如:
var a = 42;
var b = null;
var c = "foo";
if (a && (b || c)) {
console.log( "yep" );
}
這里 a && (b || c) 的結果實際上是 "foo" 而非 true查近,然后再由 if 將 foo 強制類型轉換為布爾值眉踱,所以最后結果為 true。
擴展-----布爾值隱式強制類型轉換
1)if (..) 語句中的條件判斷表達式霜威。
2)for ( .. ; .. ; .. ) 語句中的條件判斷表達式(第二個)谈喳。
3)while (..) 和 do..while(..) 循環(huán)中的條件判斷表達式。
4)? : 中的條件判斷表達式戈泼。
5)邏輯運算符 ||(邏輯或)和 &&(邏輯與)左邊的操作數(shù)(作為條件判斷表達式)婿禽。
以上情況中,非布爾值會被隱式強制類型轉換為布爾值大猛,遵循ToBoolean 抽象操作規(guī)則扭倾。
例如:
var a = 42;
var b = "abc";
var c;
var d = null;
if (a) {
console.log( "yep" ); // yep
}
while (c) {
console.log( "nope, never runs" );
}
c = d ? a : b;
c; // "abc"
if ((a && d) || c) {
console.log( "yep" ); // yep
}