0

据我所知,x++本质上是一种更简洁的说法x = x + 1。到目前为止,很清楚。在前端 Javascript 中,我偶尔会看到++x——我似乎记得从jsPerf测试中我再也找不到(谷歌如何++有效地?)这在某种特定版本的 IE 中以某种方式具有小的性能优势,并让它就这样。

但是,我最近遇到了一些关于执行顺序(JS 代码)的奇怪怪癖:

var x = 1;
console.log(x++); // 1 (?!)
console.log(x);   // 2

…然而

var x = 1;
console.log(++x); // 2 (what I would've expected)
console.log(x);   // 2

我无法理解这一点。当操作和赋值在括号内时,我们如何返回未修改的变量,因此所有权利都应该在console.log调用之前执行,更不用说执行和返回了?

4

4 回答 4

5

这是两个不同的东西

x++

是一个后增量。它在更改之前返回x,然后更改它:

tmp = x;
x = x+1;
return tmp;

然而

++x

是一个预增量。它首先更改x并随后返回新值:

x = x+1;
return x;

第二个也稍微快一些,因为您的编译器/解释器不需要创建临时变量并复制数据。

于 2012-12-13T16:25:59.447 回答
2

x++获取值,然后递增它。

++x增加值,然后获取它。

这是我使用的每种语言中支持这些运算符的行为。

于 2012-12-13T16:25:52.120 回答
1

使用 ++ AFTER 变量在该行代码之后增加值。

同样,使用 ++ BEFORE 变量会在该代码行中使用它之前增加值。

酷吧?

var x = 1;
x++;
console.log(x++); // 2 (?!)
console.log(x);   // 3
console.log(++x); // 4
console.log(x++); // 4
console.log(x);   // 5
于 2012-12-13T16:25:44.680 回答
1

您正在谈论增量运算符和 增量运算符之间的区别。在前一种情况下,操作本质上是(x = x + 1; yield x),而在第二种情况下,它是(yield x; x = x + 1)

于 2012-12-13T16:25:58.667 回答