为什么当我运行下面的JavaScript代码时,它会提醒10?我希望它能够提醒11.我在多个浏览器中试过这个。
var t=5;
t+=t++;
alert(t);
答案 0 :(得分:3)
这是因为您使用t++
代替++t
第一个首先评估数字然后递增,而第二个则相反。
t = 5; t += ++t // => 11
答案 1 :(得分:3)
假设t = 5
t += t++;
// same as
t = t + t++;
// same as
t = 5 + t++;
// same as
t = 5 + (t = t + 1, 5); // the second 5 here is the old `t` value
// same as
t = 5 + 5; // the `t = t + 1` becomes obsoleted by the other `t =`
// same as
t = 10;
那我们学到了什么?写得很简单,
t = t + t + 1;
// or
t = 2 * t + 1;
// or if you really like +=
t += t + 1;
如果您想知道为什么t++
与(t = t + 1, 5)
相同,那是因为foo++
的定义方式,这意味着
1
如果我们把它写成函数,伪代码
function (foo) { // passing foo by reference
var old_foo = foo;
foo = foo + 1; // imaging this is a reference set
return old_foo;
}
或者,使用comma operator,
foo = foo + 1, old_foo;
// i.e. if `foo` was `5`
foo = foo + 1, 5;
答案 2 :(得分:1)
您似乎假设给定left += right
,right
首先评估 ,然后添加到left
。但事实并非如此。
来自spec:
12.14.4运行时语义:评估
AssignmentExpression:LeftHandSideExpression AssignmentOperator AssignmentExpression
- 让lref成为评估LeftHandSideExpression的结果。
- 让lval成为GetValue(lref)。
- ...
醇>
如您所见,左侧在右侧之前进行评估,即在t
之前评估t++
,此时t
仍为5
。