分配时Javascript增量

时间:2012-11-26 12:50:47

标签: javascript variable-assignment increment prefix-operator

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

运行此代码时:

var x = 0;
x = ++x;

是第二行,相当于:

  • x =(x = x + 1)OR
  • x =(x + 1)

很难区分,因为结果是相同的(两者都导致x的值为1)

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

我的对手不同意并认为只要使用++运算符,该值就会保存到原始变量中。

我们哪一个是对的?

4 个答案:

答案 0 :(得分: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 + 1,则x的值现在仍为0,对吧? 不,您的x将是1。这意味着++x必须有一个赋值运算符。

答案 1 :(得分: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

答案 2 :(得分:3)

尝试用完整的英文句子写出++xx++++x:将x递增1并返回值
x++:返回x的值,并将其递增。

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

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

所以你可以写++x;一样,但由于那个表达式是整个语句,所以如果你写x++;++x ......就没有区别p>

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

因此++x;相当于x = (x + 1);

从语言规范:
++prefix increment operator
Postfix++ increment operator

答案 3 :(得分:1)

在回答问题后阅读ECMAScript Language Specification后,++x似乎等同于x = ( x = x + 1 )

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

  
      
  1. 操作结果将分配给x
  2.   
  3. 如果某些条件为真,则抛出错误
  4.   
  5. oldValue = x
  6.   
  7. newValue = oldValue + 1
  8.   
  9. 将newValue指定给x
  10.   
  11. 返回newValue
  12.   

对于后增量运算符,上面将返回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