我正在讨论前缀增量运算符,我们似乎遇到了分歧。
运行此代码时:
var x = 0;
x = ++x;
是第二行,相当于:
很难区分,因为结果是相同的(两者都导致x
的值为1)
我相信当赋值的左侧是变量本身时,该值不会保存到原始变量中。
我的对手不同意并认为只要使用++
运算符,该值就会保存到原始变量中。
我们哪一个是对的?
答案 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)
尝试用完整的英文句子写出++x
和x++
:
++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 )
。
规范概述的步骤的翻译是:
- 操作结果将分配给x
- 如果某些条件为真,则抛出错误
- oldValue = x
- newValue = oldValue + 1
- 将newValue指定给x
- 返回newValue
醇>
对于后增量运算符,上面将返回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