質問

JavaScriptはファンキーの自動変換オブジェクト:

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

のまま印刷:

4040
40140
120

これは+その他の引数はオブジェクト/文字列への変換のすべての引数の文字列を連結します。すべての引数が数値の場合、追加されていったといわれている。*および単項+に変換オブジェクト番号を使用toString(どvalueOfていることがうかがえます。

うなJavaScriptの++す。

役に立ちましたか?

解決

から ECMAScript言語仕様

11.3Postfix表現

書式

PostfixExpression:

  • LeftHandSideExpression
  • LeftHandSideExpression【LineTerminatorはこちら】++
  • LeftHandSideExpression【LineTerminatorこちら]--

11.3.1Postfix増オペレーター

の生産 PostfixExpression:LeftHandSideExpression【 LineTerminatorはこちら】++ 評価 :

  1. 評価LeftHandSideExpression.
  2. コGetValue(結果(1)).
  3. コToNumber結果(2)).
  4. 追加価値を1にした(3)と同じ規則を使用していた+オペレーター 第11.6.3).
  5. コPutValue(結果(1)、(4)).
  6. 返却結果(3).

これは擬似的なjavascriptコードをどのようpostInc作品:

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

編集:として mikesamuel :なparseInt.更新されます。

他のヒント

次のコードを示すもの:

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++最初に変換するオブジェクト番号 そしてその数を返します, その単位数、保存の価値。

これに反対することができる液が++が最初のオブジェクトを返し、その他の変数とincrementation.

++演算子は「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++;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top