阅读这两篇文章后:
我仍然对以下代码感到困惑:
var num = 0;
num++ // returns 0
++num // returns 1
为什么剂量num++
会返回0?
我知道它首先分配,然后添加一个, 但我仍然不明白它为什么不显示1。
var num = 0;
num++ // returns 0
num // returns 1
我对以下示例感到困惑:
示例:
var num = 0;
num++
// assigns then increments
// So if it assigns the num = 0, then increments to 1, Where is one being
//stored? Is it assigned anywhere?
或者是否分配表达式。
(我想这个表达式是这样的:num = num + 1;)
这可能是我最好的猜测,但它仍然不是100%清楚,我仍然不明白为什么num ++显示/返回0而不是让表达式被评估并返回1。
答案 0 :(得分:4)
也许看规范有帮助。
num++
)生产 PostfixExpression:LeftHandSideExpression [此处没有LineTerminator] ++ 评估如下:
1。让 lhs 成为评估 LeftHandSideExpression 的结果。
这仅仅意味着我们正在查看++
之前的内容,例如num
中的num++
。
2。如果满足以下条件,则抛出
SyntaxError
例外:[为简洁而省略]
此步骤确保lhs
确实引用变量。后缀运算符仅适用于变量,使用例如文字1++
将是语法错误。
获取 lhs 表示的变量的值,并将其存储在oldValue
中。想象一下它就像var oldValue = num;
。如果num = 0
那么oldValue = 0
也是如此。
4. 让 newValue 是将值1添加到 oldValue 的结果,使用与+运算符相同的规则(请参阅11.6.3)。
只需将{1}添加到oldValue
,然后将结果存储在newValue
中。像newValue = oldValue + 1
这样的东西。在我们的情况下,newValue
将是1
。
5。致电PutValue( lhs , newValue )。
这会再次将新值分配给 lhs 。等价物是num = newValue;
。所以num
现在是1
。
6. 返回 oldValue 。
返回仍为oldValue
的{{1}}的值。
再次,在伪JavaScript代码中,0
等同于:
num++
该算法与后缀运算符完全相同,但有一点不同:在最后一步中,返回var oldValue = num; // remember current value
var newValue = oldValue + 1; // add one to current value
num = newValue; // sore new value
return oldValue; // return old value
而不是newValue
:
6。返回 newValue 。
答案 1 :(得分:3)
采用以下示例:
var num = 0;
var result = 0;
以下内容:
result = num++;
等于说:
result = num;
num = num + 1;
另一方面,这个:
result = ++num;
对此更公平:
num = num + 1;
result = num;
这两个陈述有点像做常规操作的简写。
答案 2 :(得分:2)
当您键入num++
作为语句时,JavaScript将首先评估num
- 这就是为什么它显示零 - 然后增加。这就是为什么它被称为 post -increment operator。
如果你这样做,你会更清楚地看到发生的事情:
var num = 0;
num++; // Outputs 0 (current value, set in previous step), then increments
num; // Outputs 1 (current value, incremented in previous step)
使用 pre -increment,首先发生增量,所以你得到:
var num = 0;
++num; // Outputs 1
num; // Outputs 1