5

私は非常に単純な算術演算子を持っていますが、2 を返さない理由がわかりません。以下のコードは 1 を返します。x++ は x = x + 1; と等しいと思いました。

コード

var x = 1;
document.write(x++);

ただし、次のようにコードを実行すると、期待どおり 2 が返されます

コード

var x = 1;
document.write(++x);

私は何を間違っていますか?

4

3 に答える 3

12

PostIncrement(変数++) & PostDecrement(変数--)

++変数の後にor演算子を使用する--と、変数の値は、式が評価されて元の値が返されるまでインクリメント/デクリメントされません。たとえばx++、次のようなものに変換されます。

document.write(x);
x += 1;

PreIncrement(++変数) & PreDecrement(--変数)

++変数の前にor演算子を使用する--と、式が評価される前に変数の値がインクリメント/デクリメントされ、新しい値が返されます。たとえば++x、次のようなものに変換されます。

x += 1;
document.write(x);

ポストインクリメントとプリインクリメントの演算子は、C、C++、C#、Java、javascript、php で利用できます。他の言語もあると思います。why-doesnt-ruby-support-i-or-i-increment-decrement-operatorsによると、Ruby にはこれらの演算子がありません。

于 2012-06-27T01:46:08.083 に答える
9

私は(非公式に)これx++を次のように考えています:++x

x++

function post_increment(x) {
  return x; // Pretend this return statement doesn't exit the function
  x = x + 1;
}

++x

function pre_increment(x) {
  x = x + 1;
  return x;
}

2つの操作は同じことを行いますが、返される値は異なります。

var x = 1;
var y = 1;

x++; // This returned 1
++y; // This returned 2

console.log(x == y); // true because both were incremented in the end
于 2012-06-27T01:53:40.870 に答える
4

JavaScript 仕様の 70 ページと 71 ページを見ると、どのように実装する必要があるかがわかります。

プレフィックス:

  1. UnaryExpression を評価した結果を expr とします。
  2. 次の条件がすべて真の場合、SyntaxError 例外をスローします:72 © Ecma International 2011
    • Type(expr) is Reference is true
    • IsStrictReference(expr) は真です
    • Type(GetBase(expr)) は環境レコードです
    • GetReferencedName(expr) は「eval」または「arguments」のいずれかです
  3. oldValue を ToNumber(GetValue(expr)) とします。
  4. + 演算子と同じ規則を使用して、値 1 を oldValue に加算した結果を newValue とする (11.6.3 を参照)。
  5. PutValue(expr, newValue) を呼び出します。
  6. newValue を返します。

またはもっと簡単に:

  1. 増分値
  2. 戻り値

接尾辞:

  1. lhs を LeftHandSideExpression を評価した結果とします。
  2. 次の条件がすべて真の場合、SyntaxError 例外をスローします。
    • Type(lhs) は Reference が true
    • IsStrictReference(lhs) は真です
    • Type(GetBase(lhs)) は環境レコードです
    • GetReferencedName(lhs) は「eval」または「arguments」のいずれかです
  3. oldValue を ToNumber(GetValue(lhs)) とします。
  4. + 演算子と同じ規則を使用して、値 1 を oldValue に加算した結果を newValue とする (11.6.3 を参照)。
  5. PutValue(lhs, newValue) を呼び出します。
  6. 古い値を返します。

またはもっと簡単に:

  1. temp に値を割り当てます
  2. 増分値
  3. 戻り温度
于 2012-06-27T02:20:38.363 に答える