我正在讨论前缀增量运算符,我们似乎遇到了分歧。
运行此代码时:
var x = 0;
x = ++x;
第二行相当于:
- x = (x = x + 1) 或
- x = (x + 1)
很难区分,因为结果是相同的(两者的结果都是x
1)
我相信当赋值的左侧是变量本身时,该值不会保存到原始变量中。
我的对手不同意,并认为无论何时使用运算符,该值都会保存到原始变量中++
。
我们谁是对的?
我正在讨论前缀增量运算符,我们似乎遇到了分歧。
运行此代码时:
var x = 0;
x = ++x;
第二行相当于:
很难区分,因为结果是相同的(两者的结果都是x
1)
我相信当赋值的左侧是变量本身时,该值不会保存到原始变量中。
我的对手不同意,并认为无论何时使用运算符,该值都会保存到原始变量中++
。
我们谁是对的?
它被保存了,所以它类似于第一个例子。以这段代码为例:
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
必须有一个赋值运算符。
正在做:
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
只需尝试用完整的英文句子写出这两个++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
在阅读ECMAScript 语言规范以回答问题后,它似乎++x
等同于x = ( x = x + 1 )
.
规范概述的步骤的翻译是:
- 运算的结果将分配给 x
- 如果某些条件为真,则抛出错误
- 旧值 = x
- 新值 = 旧值 + 1
- 将 newValue 分配给 x
- 返回新值
对于后增量运算符,上面将返回 ,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