JavaScriptプログラムの作成プロセス中に、JSはオブジェクトを数値または文字列に自動的に変換し、異なるコンテキストに従って処理します。この自動変換のルールは次のとおりです。
オブジェクトを文字列に自動的に変換するためのルール:
1.オブジェクトがクラスに属している場合、toString()メソッドをオーバーライドする場合、メソッドは呼び出されます。 toString()呼び出しの返された結果がプリミティブ(文字列、数字、ブール、未定義、ヌル)である場合、プリミティブ値は文字列に変換されて返されます。
2。toString()メソッドがクラスtoString()によって上書きされない場合、toString()コールの返された結果は「[オブジェクトオブジェクト]」です。または、toString()メソッドがオーバーライドされますが、メソッドは結果をオブジェクトとして返します。次に、JSはオブジェクトのvalueof()メソッドを呼び出します。 valueof()呼び出しの返された結果がプリミティブ(文字列、数字、ブール、未定義、ヌル)である場合、原始値を文字列に変換して戻ります。
3.上記のポイントのいずれも満たされず、オブジェクトのtoString()メソッドまたはvalueof()メソッドを呼び出すことでプリミティブ値を取得できない場合、JSはタイプエラーエラーをスローします。
オブジェクトを数値に自動的に変換するためのルール:
1。オブジェクトの値()メソッドを呼び出します。プリミティブ値が取得された場合は、プリミティブ値を数に変換して返します。
2。valueof()メソッドからプリミティブ値を取得できない場合は、オブジェクトのtoString()メソッドを呼び出します。 toString()がプリミティブ値を返す場合、プリミティブ値を数値に変換して戻ります。
3.上記の2つのポイントのいずれも満たせない場合、JSはタイプエラーエラーをスローします。
オブジェクトを文字列に自動的に変換し、オブジェクトに数値に変換するためのルールが実際に同じであることがわかります。違いは、toString()メソッドとvalueof()メソッドの順序です。
上記のルールによると、いくつかの変換結果はよく理解できます。
1。空の配列の場合、それらを数値に変換する場合、結果は0です。これは、Arrayの値()メソッドが最初に呼び出されるためです。 valueof()は配列オブジェクト自体を返すため、JSは次に空の配列のtoString()メソッドを呼び出します。空の配列toString()が空の文字列に戻った結果、空の文字列は最終的に番号0に変換されて返されます。
2。番号メンバーが1つだけの配列の場合、同じルールを適用して数字に変換します。最終結果は数字です。
3。複数の数値メンバーを持つ配列の場合、文字列を数値に変換できないため、最終結果はNANです。
文字列に変換するのはいつですか?いつ数に変換するのですか?
オブジェクトで自動型変換を実行するとき、JSはオブジェクトのタイプと演算子に応じて、文字列または番号に変換することを選択します。特定のルールは次のとおりです。
1.オブジェクトが +演算子の両側に表示される場合、オブジェクトを文字列に変換します。
2。すべてのオブジェクト(日付オブジェクトを除く)は、最初に番号に変換されます。
3。日付オブジェクトの場合、優先度は文字列に変換されます。
+演算子にとっては、オペレーターの両側にオブジェクトまたは文字列が表示される場合を除き、「数値への変換」の操作が他のケースで実行されることを除き、 +演算子の場合は注目に値します。同時に、この操作は値間の順序にも関連しています。
実験
コードコピーは次のとおりです。
console.log(3 * []); // 0
console.log(3 * [2]); // 6
console.log(3 * [1,2]); // nan
console.log(3 + [2]); // 32
var now = new date();
console.log(now + 1); //水曜日2014年3月26日10:51:39 GMT + 0800(CST)1
console.log(now -1); // 1395802299223
console.log(現在 * 2); // 2791604598448
console.log(true + true); // 2
console.log(2 + null); // 2、nullは0に変換されます
console.log(2 + undefined); // nan、未定義はnanに変換されます
console.log(1 + 2 + "cats"); // 3猫
console.log(1 +(2 + "cats")); // 12猫