循環中多個條件的問題(邏輯與,邏輯或,運算符優先順序)
- 2019 年 10 月 3 日
- 筆記
循環中設置多個條件,有時會得不到自己期望的結果,下面是我對運算符優先順序不清楚,造成的錯誤總結:
1 <script type="text/javascript"> 2 var str = prompt("你愛我嗎?"); 3 while(str != "我愛你" && "我愛你!"){ 4 str = prompt("你愛我嗎?"); 5 } 6 </script>
希望輸入”我愛你”和”我愛你!”都可以結束循環。
但是 != 的優先順序高於 && 、||,上述程式碼會先執行str != “我愛你”,如果為ture,則為 true && “我愛你!”,返回”我愛你!”,”我愛你!”為ture,循環繼續。如果前面為false(輸入”我愛你”),false && “我愛你!”,返回false,循環結束。即第二個”我愛你!”一直為true,沒有意義。邏輯上就是只有輸入”我愛你”,循環才能結束。
PS:(0、””、”、null、undefined、NaN為假,其餘都是真)
修改為:
1 <script type="text/javascript"> 2 var str = prompt("你愛我嗎?"); 3 while(str != "我愛你" && str != "我愛你!"){ 4 str = prompt("你愛我嗎?"); 5 } 6 </script>
先執行兩個 != ,再進行 && 運算。兩個條件都可以使用。邏輯上就是,輸入”我愛你”或者”我愛你!”,都可以結束循環。
再分析下邏輯或:
<script type="text/javascript"> var str = prompt("你愛我嗎?"); while(str != "我愛你" || "我愛你!"){ str = prompt("你愛我嗎?"); } </script>
如果輸入非”我愛你”,則 true || “我愛你!”,返回true,循環繼續。如果輸入”我愛你”,則 false || “我愛你!”,返回 “我愛你!”,結果還是true,循環仍然繼續。邏輯上,不管你輸入什麼,循環都不會停。
<script type="text/javascript"> var str = prompt("你愛我嗎?"); while(str != "我愛你" || str !="我愛你!"){ str = prompt("你愛我嗎?"); } </script>
此處邏輯為,只有在輸入的值即為”我愛你”,又為”我愛你!”,循環才能結束。字元串沒有這樣的值,因此沒有意義。
循環中多個條件可以用 &&、|| 連接,但是一定要注意運算符優先順序的問題,否則就會出現各種問題。
總結為兩個知識點:
1. 0、””、”、null、undefined、NaN的布爾值為假,其餘都是真
2. JS運算符優先順序 “!=” 優先順序高於&& 再高於||
優先順序 | 運算類型 | 關聯性 | 運算符 |
---|---|---|---|
20 | 圓括弧 | n/a | ( … ) |
19 | 成員訪問 | 從左到右 | … . … |
19 | 需計算的成員訪問 | 從左到右 | …[ … ] |
19 | new (帶參數列表) | n/a | new … ( … ) |
19 | 函數調用 | 從左到右 | … ( … ) |
18 | new (無參數列表) | 從左到右 | new … |
17 | 後置遞增(運算符在後) | n/a | … ++ |
17 | 後置遞減(運算符在後) | n/a | … — |
16 | 邏輯非 | 從右到左 | ! … |
16 | 按位非 | 從右到左 | ~ … |
16 | 一元加法 | 從右到左 | + … |
16 | 一元減法 | 從右到左 | – … |
16 | 前置遞增 | 從右到左 | ++ … |
16 | 前置遞減 | 從右到左 | — … |
16 | typeof | 從右到左 | typeof … |
16 | void | 從右到左 | void … |
16 | delete | 從右到左 | delete … |
15 | 冪 | 從右到左 | … ** … |
14 | 乘法 | 從左到右 | … * … |
14 | 除法 | 從左到右 | … / … |
14 | 取模 | 從左到右 | … % … |
13 | 加法 | 從左到右 | … + … |
13 | 減法 | 從左到右 | … – … |
12 | 按位左移 | 從左到右 | … << … |
12 | 按位右移 | 從左到右 | … >> … |
12 | 無符號右移 | 從左到右 | … >>> … |
11 | 小於 | 從左到右 | … < … |
11 | 小於等於 | 從左到右 | … <= … |
11 | 大於 | 從左到右 | … > … |
11 | 大於等於 | 從左到右 | … >= … |
11 | in | 從左到右 | … in … |
11 | instanceof | 從左到右 | … instanceof … |
10 | 等號 | 從左到右 | … == … |
10 | 非等號 | 從左到右 | … != … |
10 | 全等號 | 從左到右 | … === … |
10 | 非全等號 | 從左到右 | … !== … |
9 | 按位與 | 從左到右 | … & … |
8 | 按位異或 | 從左到右 | … ^ … |
7 | 按位或 | 從左到右 | … | … |
6 | 邏輯與 | 從左到右 | … && … |
5 | 邏輯或 | 從左到右 | … || … |
4 | 條件運算符 | 從右到左 | … ? … : … |
3 | 賦值 | 從右到左 | … = … |
3 | 賦值 | 從右到左 | … += … |
3 | 賦值 | 從右到左 | … -= … |
3 | 賦值 | 從右到左 | … /= … |
3 | 賦值 | 從右到左 | …% = … |
3 | 賦值 | 從右到左 | … *= … |
2 | yield | 從右到左 | yield … |
2 | yield* | 從右到左 | yield* … |
1 | 展開運算符 | 從左到右 | … … |
0 | 逗號 | 從左到右 | … , … |