6

前置インクリメント演算子について話し合っていたのですが、意見の相違があったようです。

このコードを実行すると:

var x = 0;
x = ++x;

2行目は次と同等です:

  • x = (x = x + 1) または
  • x = (x + 1)

結果が同じであるため、違いを見分けるのは困難です (どちらもx値が 1 になります)。

割り当ての左側が変数自体である場合、値は元の変数に保存されないと思います。

++私のカウンターパートは同意せず、演算子が使用されるたびに値が元の変数に保存されると考えています。

私たちのどちらが正しいですか?

4

4 に答える 4

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、そこに代入演算子が必要であることを意味します。

于 2012-11-26T12:52:40.943 に答える
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
于 2012-11-26T12:52:32.537 に答える
1

質問への回答としてECMAScript 言語仕様を読んだ後、それ++xは と同等であると思われx = ( x = x + 1 )ます。

仕様で概説されている手順の翻訳は次のとおりです。

  1. 演算の結果は x に代入されます
  2. 特定の条件が true の場合にエラーをスローする
  3. 古い値 = x
  4. 新しい値 = 古い値 + 1
  5. newValue を x に割り当てます
  6. 新しい値を返す

後置インクリメント演算子の場合、上記は の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
于 2012-11-26T13:08:36.043 に答える