循環中多個條件的問題(邏輯與,邏輯或,運算符優先順序)

  • 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 逗號 從左到右 … , …