2

为什么这段代码输出 3 而不是 2?

var i = 1; 
i = ++i + --i; 
console.log(i);

我期望:

++i // i == 2
--i // i == 1
i = 1 + 1 // i == 2

我在哪里犯错了?

4

8 回答 8

10

更改按以下顺序发生:

  1. 递增i(至 2)
  2. i加法的左侧(2)
  3. 递减i(至 1)
  4. i加法的右手边 (1)
  5. 执行加法并分配给i(3)

…看到你尝试这样做让我对为什么 JSLint 不喜欢++and有了一些了解--

于 2011-08-02T16:38:27.420 回答
3

这样看

x = (某事)
x = (++i) + (某事)
x = (2) + (某事)
x = (2) + (--i)
x = (2) + (1)

这些术语是从左到右评估的,一旦评估了第一个 ++i,当您使用--i 更改其值时,它不会被重新评估。

于 2011-08-02T16:39:40.997 回答
2

你的第二行是加 2 + 1。

按顺序,解释器将执行:

++i  // i == 2
+
--i  // i == 1
i = 2 + 1
于 2011-08-02T16:38:26.123 回答
0

++i等于 2,`--i' 等于 1。2 + 1 = 3。

于 2011-08-02T16:38:42.060 回答
0

你的操作顺序有点偏离。事情是这样的:

  1. i 增加 1 (++i),结果为 2。这存储在 i 中。
  2. 然后将该值 2 与 (--i) 的值相加,即 1。2 + 1 = 3
于 2011-08-02T16:39:01.247 回答
0

因为当您使用 ++i 时, i 的值会递增然后返回。但是,如果使用 i++,则返回 i 的值,然后递增。参考

于 2011-08-02T16:39:10.297 回答
0
++$a   Increments $a by one, then returns $a.
$a++   Returns $a, then increments $a by one.
--$a   Decrements $a by one, then returns $a.
$a--   Returns $a, then decrements $a by one.
于 2011-08-02T16:41:45.813 回答
0

因为您希望此代码能够像引用对象一样工作,并且在完成一元操作之前不会收集值。但在大多数语言中,首先计算表达式,因此 i 返回 i 的值,而不是 i 本身。

如果你有 ++(--i) 那么你是对的。

简而言之,不要这样做。

该操作的结果在每种语言/编译器/解释器中的定义都不相同。因此,虽然它3会导致 JavaScript,但它可能会导致2其他地方。

于 2012-08-03T14:16:31.657 回答