標籤:轉換 計算 math -- 決定 為什麼 code ima nan
先從兩個問題看起:
第一個問題 為什麼 a && b 返回的是true,b && a 返回的是6
1 var user = 6;2 var both = true;3 4 console.log( user && both); //true5 console.log( both && user); //6
第二個問題 both進行自減 最後列印的依舊是3
1 var user = false;2 var both = 3;3 4 console.log( user && both--); // false5 console.log(both); // 3
先從三個層次來理解(以&&為例說明):
第一層理解:運算元都是布爾值的時候,只有二者都為true的時候,結果才為true,否則為false。
第二層理解:&&可以對真值和假值進行運算,如果兩個都是真值,則返回一個真值,否則返回一個假值。但是,真值並不僅限於true,假值也並不僅限於false,下面這些值會被轉換成false(其他所有值都為true)
undefined
null
0/-0
NaN
" "
在js中,進行&&操作,結果並不總是true和false,而是當前的值。當前的值有可能就是數值、字串等。
如果第一個運算式為真,那麼就以第二個運算式的值作為其結果,這個結果不是轉換之後的值,而是它本身。
如果第一個運算式為假,那麼就以第一個運算式的值作為其結果,這個結果不是轉換之後的值,而是它本身。
//上面第一個問題
1 var user = 6;2 var both = true;3 var math = 0;4 console.log( user && both); //true5 console.log( both && user); //66 console.log( both && math); //07 console.log( math && both); //0
第三層理解:短路運算,運算過程,首先計算左運算元的值,如果計算結果為假值,則整個運算式結果就為假值,也就是左運算元的值 同時停止右運算元的求值。如果左運算元的結果為真值,則整個結果依賴於右運算元的值。
關於短路運算的說明:
在&&和||運算時,如果第一個運算式的值就已經能夠確定整個運算的結果,那麼第二個運算式將不會執行
對於&&操作而言 第一個運算式的值為假值 那就決定了整個運算結果為假值 所以第一個運算式不會執行 所以y-- 並沒有執行 y的值仍是3
//上面第二個問題
1 var x = false;2 var y = 3;3 console.log(x && y--); // false4 console.log(y); // 3
對於||而言,
如果第一個運算式的值為真值,結果就是第一個運算式的值,不是轉換之後的,而是它本身。
如果第一個運算式的值為假值,結果就是第二個運算式的值,不是轉換之後的,而是它本身。
1 var user = true;2 var both = 10;3 4 console.log(user || ++both); //true5 console.log(both); //10
&& 與 || 具有完全相同的原理,只是運算規則不太一樣。
1 var a = 10;2 var b = true;3 var c = 0;4 5 console.log(a || b); //106 console.log(b || a); //true7 8 console.log(b || c); //true9 console.log(c || b); //true
javascript-深入理解&&和||