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


 循環中設置多個條件,有時會得不到自己期望的結果,下面是我對運算符優先級不清楚,造成的錯誤總結:

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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM