1

JavaScript は、オブジェクトに対してファンキーな自動変換を行います。

var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));

印刷されます:

4040
40140
120

これは、引数のいずれかがオブジェクト/文字列である場合、+ はすべての引数を文字列に変換してから連結しようとするためです。すべての引数が数値の場合は、それらを合計します。* および単項 + toString を使用してオブジェクトを数値に変換します (ここには示されていませんが、valueOf も同様です)。

JavaScript は ++ 演算子に対して何をしますか?

4

3 に答える 3

4

ECMAScript 言語仕様から

11.3 後置式

構文

後置式:

  • LeftHandSide式
  • LeftHandSideExpression [ここに LineTerminator はありません] ++
  • LeftHandSideExpression [ここに LineTerminator はありません] --

11.3.1 後置インクリメント演算子

プロダクションPostfixExpression : LeftHandSideExpression [ここに LineTerminator はありません] ++は次のように評価されます。

  1. LeftHandSideExpression を評価します。
  2. GetValue(Result(1)) を呼び出します。
  3. ToNumber(Result(2)) を呼び出します。
  4. + 演算子 (セクション 11.6.3) と同じルールを使用して、値 1 を Result(3) に追加します。
  5. PutValue(Result(1), Result(4)) を呼び出します。
  6. 結果 (3) を返します。

これは、postInc がどのように機能するかを示す疑似 JavaScript コードです。

function postInc(a) {
  var x = +a; // Converts a to a number, Section 11.4.6 Unary + Operator
  a = x + 1;
  return x;
}

編集: mikesamuelが言ったように: parseInt ではありません。それを反映するために更新されました。

于 2008-12-22T17:42:59.283 に答える
3

次のコードは、これをよく示しています。

var a = {toString: function() {return "40"; }};
nl(typeof a);
nl(typeof +a);
nl(typeof a);
nl(typeof (a++));
nl(a);
nl(typeof a);

出力は次のとおりです。

object
number
object
number
41
number

単項プラスは、オブジェクトを数値に変換し、変更しません。a++ は、最初にオブジェクトを数値に変換し、次にその数値を返し、数値をインクリメントして値を a に格納します。

これは、a++ が最初にオブジェクトを返し、次に数値への変換とインクリメントを行う別の解決策とは対照的です。

于 2008-12-22T11:38:13.453 に答える
1

演算子は「++toNumber」変換を行います (基本的には型規則と valueOf 関数の組み合わせ)。基本的に解決式

 resolveExpression++

JS エンジンが実行する手順は次のとおりです。

 <temp> = toNumber(resolveExpression);
 resolveExpression = <temp> + 1;
 <result> = <temp>

非アトミック解決式の場合。base.resolve++またはbase["resolve"]++などbaseは、一度だけ解決されてから再利用されます。いずれにせよ、これは無関係ですが、インクリメントされる値が、ベース オブジェクトを変更する valueOf 実装を持つオブジェクトである場合は重要です。

例えば。

base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;
于 2008-12-22T13:46:12.727 に答える