String(value)とvalue.toString()の違いは何ですか?質問する

String(value)とvalue.toString()の違いは何ですか?質問する

Javascript には型と型変換に関する「トリック」がたくさんあるので、これら 2 つの方法は同じなのか、それとも異なる特殊なケースがあるのか​​疑問に思っています。

ベストアンサー1

それらは完全に同じではありません、そして実際、関数として呼び出される文字列コンストラクタ(最初の例) は、最後に、toString渡されたオブジェクトのメソッドを呼び出します。例:

var o = { toString: function () { return "foo"; } };
String(o); // "foo"

一方、識別子がnullまたはを参照している場合undefined、メソッドは使用できずtoStringTypeError例外:

var value = null;
String(null);     // "null"
value.toString(); // TypeError

String関数として呼び出されるコンストラクターは、おおよそ次のものと同等になります。

value + '';

型変換ルールは物体-に-原生的仕様書に詳細が記載されており、[[DefaultValue]]内部操作。

簡単にまとめると、物体-に-、次の手順が実行されます。

  1. 利用可能な場合は、toStringメソッドを実行します。
    • result原生的、 を返しresult、それ以外の場合はステップ 2 に進みます。
  2. 利用可能な場合は、valueOfメソッドを実行します。
    • result原生的、 を返しresult、それ以外の場合はステップ 3 に進みます。
  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内部操作。

この記事も読むことをお勧めします:

おすすめ記事