Javascript 为什么while循环中的这个条件会像循环体的一部分一样被执行?

Javascript 为什么while循环中的这个条件会像循环体的一部分一样被执行?,javascript,while-loop,conditional-statements,Javascript,While Loop,Conditional Statements,以下是相关函数(此示例取自): 在上面的示例中,第二个num--对它的工作不是必需的。当我在devtools控制台中运行它时,另一个类似的表达式似乎不会发生这种情况: ​if(x-2==5){x--} 这里,如果x是7,那么x将减少1,​不​ 如果x是7,那么x将减去2,然后x将减小1。但是在上面的例子中​数值​, 后一个原则才是有效的 有人能解释一下原因吗?因为每次计算表达式num--时(在循环的每次迭代中都是这样,以查看是否满足条件),它将num减少一次。很多JavaScript大师会告诉你

以下是相关函数(此示例取自):

在上面的示例中,第二个
num--
对它的工作不是必需的。当我在devtools控制台中运行它时,另一个类似的表达式似乎不会发生这种情况:

if(x-2==5){x--}

这里,如果x是7,那么x将减少1,​​ 如果x是7,那么x将减去2,然后x将减小1。但是在上面的例子中​<代码>数值​, 后一个原则才是有效的


有人能解释一下原因吗?

因为每次计算表达式
num--
时(在循环的每次迭代中都是这样,以查看是否满足条件),它将
num
减少一次。很多JavaScript大师会告诉你要避免使用
num--
num++
--num
++num
,因为它们的副作用并不那么直观

我的建议是,即使需要再输入几个字符,也要坚持使用乍一看更具可读性的东西

while (num > 2) {
  num = num - 1;
}
至少,只能将它们作为独立的语句来使用,以明确它们所做的事情

while (num > 2) {
  num--;
}

在表达式
x-2==5
的第二个示例中,此表达式根本不在
x
上运行;它不会改变它的值。您没有像执行
x--
时那样将任何内容分配回
x
<代码>x--完全等同于
x=x-1。恰好在赋值之前,它还返回
x
的值;这样,它就可以用作条件。这就像从一个变量中读取数据,然后在一条语句中写入所有数据。

x-2
将表示一个新值,即如果打开控制台并键入
x-2
,它将以
5
响应,但该值不会分配给任何对象(因此
x
不受影响)。
--
++
运算符是自包含的语句,会影响它们所操作的变量。因此,您的
num-->2
是一个名称,后面跟一个
num=num-1
,用于比较当前值,然后执行一个数学运算,并将运算结果赋给变量。

num--
做两件事:从变量
num
中减去
1
(将结果赋回
num
)并且还返回要在其余枚举中使用的
num
的原始值。所以

(num-- > 2)
缩写为:

(temp = num; num = num - 1; temp > 2)
您的while循环可以写为:

while (num > 2) {
    num--;
    tmp = tmp * num;
}

请注意,
while
子句中不再有
num--
。如果我这样做了,变量将被递减两次:一次是在测试条件时,另一次是在循环内部。

num——更改num的值必须记住If/for/while语句中的括号没有什么特殊之处。它的求值方式与循环体中的代码相同。如果圆括号表达式返回的值为truthy,则条件成功。甚至赋值也是表达式:
x=1
将返回值
1
。后一点是正确的,但我不认为这会降低直观可读性。它们在独立语句中使用时完全可读。当它们作为其他表达的一部分嵌入时,可能会令人困惑。这是真的,但这都是主观的,与答案无关。我和我的许多同事都认为,这些运算符只是粗糙的,甚至是独立的语句。不管怎样,这显然让人困惑,OP.@Codorilla,这不是我要说的。我是说没有人认为(I=0;I
中的
I++
不可读。但是
x++<2
可能会令人困惑,因为您将递增与比较相结合。或C样式
*p++=x
。其中一些已经成为习惯用法,但在你习惯它们之前,它们仍然令人困惑。我想这只是减量/增量运算符的一个怪癖吧?在编写代码时,我将接受您的建议。但是,当我阅读其他人的代码时,我必须询问它何时出现,如上面的示例所示。谢谢。你的对等词不正确
num--
递减变量,但返回旧值,而不是新值。难道你不知道
x--
--x
之间的区别吗?是的,我只是从不在重要的情况下使用它们,所以我把它们混淆了。明白我所说的非直观吗有趣的是这不是一回事。如果将
num
初始化为
5
,则在第二个示例中
num
实际上等于
2
,而在原始示例中,它等于
1
,因为在比较之前先递减,在最后一个示例中,当
num==2
时,在确定它不小于
2
之前,您将递减。在这种情况下,功能上一点都不重要,但这是一个很好的潜在机会!说得好。它在给定的程序中并不重要,因为它在循环之后不使用
num
,所以它的最终值是无关的。但它也可以在其他项目中使用。
(temp = num; num = num - 1; temp > 2)
while (num > 2) {
    num--;
    tmp = tmp * num;
}