循環中設置多個條件,有時會得不到自己期望的結果,下面是我對運算符優先級不清楚,造成的錯誤總結:
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 | 逗號 | 從左到右 | ... , ... |