1. ホーム
  2. javascript

[解決済み] String(value) と value.toString() の違いは何ですか?

2022-05-31 17:27:04

質問

Javascriptには、型や型変換に関するたくさんのトリックがあります。この2つの方法は同じなのでしょうか、それとも何か異なる点があるのでしょうか?

どのように解決するのですか?

完全に同じというわけではなく、実は として呼び出されるStringコンストラクタは、関数として呼び出される (あなたの最初の例) は、最後に 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]] の内部動作に記載されています。

簡単にまとめますと オブジェクト -から 文字列 に変換する場合、以下の手順で行います。

  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 の内部操作。

こちらの記事もおすすめです。