今天在網上查了js的&&和||的相關文章,感覺現在很多人看文章都缺少驗證的思想。接下來我來講一下我對&&和||的瞭解,以及貼上對應的demo。
首先確認以下幾點:&&與||的執行優先級是一樣的,不論有多少的混用都是從左到右執行,同時需要注意短路特性
1、JS中的&&符號:
短路 與:A && B
1.1 如果A爲false,表達式返回A (這個就是短路特性,提前結束)
1.2 如果A爲true,表達式返回B
結論:一假即假(顧名思義,“且” 肯定是 A 且 B同時爲真,結果才爲真)
下面來些demo
0 && 1 // 結果 0 原因見 1.1
1 && 0 // 結果 0 原因見 1.2
1 && 2 // 結果 2 原因見 1.2
2、JS中的||符號:
|| 短路 或:A || B
2.1 如果A爲true,表達式返回A (這個就是短路特性,提前結束)
2.2 如果A爲false,表達式返回B
結論:一真即真(顧名思義,“或“ 只要 A 或 B有一個爲真,結果就爲真)
下面來些demo
1 || 0 // 結果 1 原因見 2.1
0 || 2 // 結果 2 原因見 2.2
對於一個符號的話都比較好理解,對於兩個符號混用的也是同樣的道理
1 && 3 || 0 && 4 // 結果是 3
很多分析:先執行1&&3 返回3,再執行0&&4返回0,最後執行結果比較 3||0 返回 3,這個過程是不對的,其實正確的執行順序應該是遵循短路特性,具體過程如下:
第1步:先執行1&&3 因爲,1爲真,沒有提前短路,返回3
第2步:再執行3 || 0 ,這時候3 || 0的時候,因爲 || 的第一個是3,
提前結束,所以返回3,其實是沒有執行 0 && 4的。
接下來用一個demo來驗證一下:
備註: 爲了驗證,我們把原先 a 改成 (console.log(“run a”), a),這裏用的了 運算符 “,” 這個運算符是取最後一個的值,所以等價。
(console.log("run 1"), 1) && (console.log("run 3"), 3) || (console.log("run 0"), 0) && (console.log("run 4"), 4)
上面的結果驗證了我們的猜想。
其實 && 和 || 很簡單,只要知道它們每個返回結果,以及短路特性,就可以算出最後的結果。
&& 和 || 除了判斷結果之外,還能給變量賦值默認值的作用:
eg:
a = a || “默認值”;