私は非常に単純な算術演算子を持っていますが、2 を返さない理由がわかりません。以下のコードは 1 を返します。x++ は x = x + 1; と等しいと思いました。
コード
var x = 1;
document.write(x++);
ただし、次のようにコードを実行すると、期待どおり 2 が返されます
コード
var x = 1;
document.write(++x);
私は何を間違っていますか?
私は非常に単純な算術演算子を持っていますが、2 を返さない理由がわかりません。以下のコードは 1 を返します。x++ は x = x + 1; と等しいと思いました。
コード
var x = 1;
document.write(x++);
ただし、次のようにコードを実行すると、期待どおり 2 が返されます
コード
var x = 1;
document.write(++x);
私は何を間違っていますか?
++
変数の後にor演算子を使用する--
と、変数の値は、式が評価されて元の値が返されるまでインクリメント/デクリメントされません。たとえばx++
、次のようなものに変換されます。
document.write(x);
x += 1;
++
変数の前にor演算子を使用する--
と、式が評価される前に変数の値がインクリメント/デクリメントされ、新しい値が返されます。たとえば++x
、次のようなものに変換されます。
x += 1;
document.write(x);
ポストインクリメントとプリインクリメントの演算子は、C、C++、C#、Java、javascript、php で利用できます。他の言語もあると思います。why-doesnt-ruby-support-i-or-i-increment-decrement-operatorsによると、Ruby にはこれらの演算子がありません。
私は(非公式に)これ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
JavaScript 仕様の 70 ページと 71 ページを見ると、どのように実装する必要があるかがわかります。
プレフィックス:
- UnaryExpression を評価した結果を expr とします。
- 次の条件がすべて真の場合、SyntaxError 例外をスローします:72 © Ecma International 2011
- Type(expr) is Reference is true
- IsStrictReference(expr) は真です
- Type(GetBase(expr)) は環境レコードです
- GetReferencedName(expr) は「eval」または「arguments」のいずれかです
- oldValue を ToNumber(GetValue(expr)) とします。
- + 演算子と同じ規則を使用して、値 1 を oldValue に加算した結果を newValue とする (11.6.3 を参照)。
- PutValue(expr, newValue) を呼び出します。
- newValue を返します。
またはもっと簡単に:
接尾辞:
- lhs を LeftHandSideExpression を評価した結果とします。
- 次の条件がすべて真の場合、SyntaxError 例外をスローします。
- Type(lhs) は Reference が true
- IsStrictReference(lhs) は真です
- Type(GetBase(lhs)) は環境レコードです
- GetReferencedName(lhs) は「eval」または「arguments」のいずれかです
- oldValue を ToNumber(GetValue(lhs)) とします。
- + 演算子と同じ規則を使用して、値 1 を oldValue に加算した結果を newValue とする (11.6.3 を参照)。
- PutValue(lhs, newValue) を呼び出します。
- 古い値を返します。
またはもっと簡単に: