6

我正在讨论前缀增量运算符,我们似乎遇到了分歧。

运行此代码时:

var x = 0;
x = ++x;

第二行相当于:

  • x = (x = x + 1) 或
  • x = (x + 1)

很难区分,因为结果是相同的(两者的结果都是x1)

我相信当赋值的左侧是变量本身时,该值不会保存到原始变量中。

我的对手不同意,并认为无论何时使用运算符,该值都会保存到原始变量中++

我们谁是对的?

4

4 回答 4

8

它被保存了,所以它类似于第一个例子。以这段代码为例:

var v = 0;
v = ++v + ++v + ++v;
// Returns 6

那是因为这将转化为:

v = (0+1) + ((0+1)+1) + (((0+1)+1)+1);

或者,更准确地说:

v = 0+1 +
v = 1+1 + //Previous value of v + 1
v = 2+1   //Previous value of v + 1

为什么?

++v将首先保存 v 的增量值,然后返回这个增量值。
为了简化事情,请在您的控制台中尝试以下操作:

x = 0;
++x;

如果++x将解析为x + 1x那么现在的值仍然是0,对吗?
不,你的x意志是1。这意味着其中++x必须有一个赋值运算符。

于 2012-11-26T12:52:40.943 回答
3

正在做:

var x = 0;
console.log(++x); // will make print 1

正在做 :

var x = 0;
console.log(x++); // will make print 0
console.log(x); // will print 1
于 2012-11-26T12:52:32.537 回答
3

只需尝试用完整的英文句子写出这两个++x句子x++::
++x将 x 加一并返回值
x++:返回 x 的值,并将其递增。

你的第二行 ( x = ++x;) 相当于x = (x += 1),是的。
看看你写过的任何循环:

for (var i = 0;i<100;i++)//<-- no need for another assign here

所以你本可以写成++x;一样的,但是由于那个表达式是整个语句,如果你写x++;或者++x......

您可能知道xxsomeVar将变量加 1,将结果值分配给该变量,然后返回它,someVar++返回变量的当前值,然后将其加 1(当然,新值也分配给变量)。

所以++x;相当于x = (x + 1);

来自语言规范:
++prefix increment operator
Postfix++ increment operator

于 2012-11-26T13:11:50.653 回答
1

在阅读ECMAScript 语言规范以回答问题后,它似乎++x等同于x = ( x = x + 1 ).

规范概述的步骤的翻译是:

  1. 运算的结果将分配给 x
  2. 如果某些条件为真,则抛出错误
  3. 旧值 = x
  4. 新值 = 旧值 + 1
  5. 将 newValue 分配给 x
  6. 返回新值

对于后增量运算符,上面将返回 ,oldValue而不是newValue.

var x = 0;
// x is assigned 1 during the post-increment operation but because
// the oldValue is returned it is immediately replaced by 0.
x = x++; 
console.log( x ) // prints 0
于 2012-11-26T13:08:36.043 回答