三元运算符未按预期处理后增量

时间:2019-09-09 06:41:42

标签: javascript ternary-operator

所以这可能是一个愚蠢的问题,但是我时不时地遇到这个语法错误,并且似乎无法学习我的课程-因为我根本不明白为什么这行不通。 / p>

由于某种原因,三元运算符无法处理增量或减量。

在控制台中,我找到了以下结果:

  // Firstly
var iteration = undefined; 

  // Expected increment, unexpected result
iteration = iteration == undefined ? 0 : iteration++;  //returns 0 every time

  // Then I thought maybe ternary doesn't return assignments
iteration = iteration == undefined ? 0 : iteration+=1; //increments iteration

  // Works as expected
iteration = iteration == undefined ? 0 : iteration+1;  //increments iteration

在搜索答案时,我发现另一个用户有same experience with the unexpected behavior

更多搜索后,我发现预增量可以正常工作:

iteration = iteration == undefined ? 0 : ++iteration; //increments iteration

还有came across this answer,当试图确定为什么预增量起作用时。

对于我来说,为什么它起作用而后增量不起作用确实很有意义-有点。我想,如果三元运算以这种方式工作,则在某个时候增量值可能会被初始值覆盖,但这就是我能想到的。

但是实际上,我从后增量中获得的预期行为将是返回迭代,然后对其进行迭代... 之后

例如,这段代码:

var bar = undefined;
//foo is set immediately and bar is incremented after it is returned
foo = bar == undefined ? bar=0 : bar++; //sets foo to be what bar was before the increment

希望您能够在这里忍受我。我确实知道,在找到许多可靠且直接的方法来完成工作之后,我确实不需要答案,但我只是很困惑为什么这样做会如此。

问题:

为什么三元运算符在返回后不更新返回的后增量(或后缀)值?

一个comment on this answer指出

  

counter ++求和为counter的当前值,然后将其递增。递增后,您将把计数器的旧值分配给计数器。

但是我仍然不明白为什么操作顺序是这种方式的。

Another helpful Pre-increment vs Post-increment for C ++(具有讽刺意味的搞笑答案)

2 个答案:

答案 0 :(得分:3)

无论解释器是否在调用增量前或增量后的表达式上运行,都会在解析表达式之前立即重新分配变量。例如:

iteration = iteration == undefined ? 0 : iteration++;

就像

function doPostIncrement() {
  const preIncrementValue = increment;
  increment = increment + 1;
  return preIncrementValue;
}
iteration = iteration == undefined ? 0 : doPostIncrement();

此外,赋值解析为值,所以

iteration = iteration == undefined ? 0 : iteration+=1; //increments iteration

就像

function addOneToIncrementAndReturnIncrement() {
  increment = increment + 1;
  return increment;
}
iteration = iteration == undefined ? 0 : addOneToIncrementAndReturnIncrement();

实际上不是函数调用,但也没有什么不同,因为重新分配是在函数解析之前或在前/后增量表达式解析之前完成的。

答案 1 :(得分:3)

在赋值表达式中,首先对整个右侧进行求值,然后将其结果值赋给左侧。这意味着需要先计算后增量表达式并将其转换为一个值,然后再将其分配给左侧。后递增运算符不知道它属于哪个更大的表达式。将对其进行原子评估。即,它不会先返回其值,然后完成赋值操作,然后然后完成后递增操作。当评估表达式iteration++时,iteration的值将递增 ,并且表达式一次生成原始值iteration