Javascript には型と型変換に関する「トリック」がたくさんあるので、これら 2 つの方法は同じなのか、それとも異なる特殊なケースがあるのか疑問に思っています。
ベストアンサー1
それらは完全に同じではありません、そして実際、関数として呼び出される文字列コンストラクタ(最初の例) は、最後に、toString
渡されたオブジェクトのメソッドを呼び出します。例:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
一方、識別子がnull
またはを参照している場合undefined
、メソッドは使用できずtoString
、TypeError
例外:
var value = null;
String(null); // "null"
value.toString(); // TypeError
String
関数として呼び出されるコンストラクターは、おおよそ次のものと同等になります。
value + '';
型変換ルールは物体-に-原生的仕様書に詳細が記載されており、[[DefaultValue]]
内部操作。
簡単にまとめると、物体-に-弦、次の手順が実行されます。
- 利用可能な場合は、
toString
メソッドを実行します。- が
result
原生的、 を返しresult
、それ以外の場合はステップ 2 に進みます。
- が
- 利用可能な場合は、
valueOf
メソッドを実行します。- が
result
原生的、 を返しresult
、それ以外の場合はステップ 3 に進みます。
- が
- 投げる
TypeError
。
上記のルールを踏まえて、関連するセマンティクスの例を挙げてみましょう。
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
このメカニズムについてもっと知りたい場合は、ToPrimitive
そしてそのToString
内部操作。
この記事も読むことをお勧めします: