循环中设置多个条件,有时会得不到自己期望的结果,下面是我对运算符优先级不清楚,造成的错误总结:
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 | 逗号 | 从左到右 | ... , ... |