­

循环中多个条件的问题(逻辑与,逻辑或,运算符优先级)

  • 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 逗号 从左到右 … , …