所以这可能是一个愚蠢的问题,但是我时不时地遇到这个语法错误,并且似乎无法学习我的课程-因为我根本不明白为什么这行不通。 / 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
希望您能够在这里忍受我。我确实知道,在找到许多可靠且直接的方法来完成工作之后,我确实不需要答案,但我只是很困惑为什么这样做会如此。
问题:
为什么三元运算符在返回后不更新返回的后增量(或后缀)值?
counter ++求和为counter的当前值,然后将其递增。递增后,您将把计数器的旧值分配给计数器。
但是我仍然不明白为什么操作顺序是这种方式的。
Another helpful Pre-increment vs Post-increment for C ++(具有讽刺意味的搞笑答案)
答案 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
。