このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Symbol.toStringTag

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2017年4月以降、すべてのブラウザーで利用可能です。

Symbol.toStringTag は静的データプロパティで、ウェルノウンシンボルSymbol.toStringTag を表します。Object.prototype.toString()this に対して、このオブジェクトの型を表す文字列を持つプロパティを、このシンボルで探します。

試してみましょう

class ValidatorClass {
  get [Symbol.toStringTag]() {
    return "Validator";
  }
}

console.log(Object.prototype.toString.call(new ValidatorClass()));
// 予想される結果: "[object Validator]"

ウェルノウンシンボル Symbol.toStringTag です。

Symbol.toStringTag のプロパティ属性
書込可能不可
列挙可能不可
設定可能不可

既定のタグ

値によっては Symbol.toStringTag を持たず、特別な toString() 表現を持つものもあります。完全な一覧は、Object.prototype.toString() を参照してください。

js
Object.prototype.toString.call("foo"); // "[object String]"
Object.prototype.toString.call([1, 2]); // "[object Array]"
Object.prototype.toString.call(3); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
// … などなど

組み込み toStringTag シンボル

ほとんどの組み込みオブジェクトは、独自の [Symbol.toStringTag] プロパティを提供 しています。ほとんどの組み込みオブジェクト [Symbol.toStringTag] プロパティは書き込み不可、列挙不可、構成可能です。例外は Iterator で、互換性の理由から書き込み可能です。

Promise のようなコンストラクターオブジェクトでは、コンストラクターのすべてのインスタンスが [Symbol.toStringTag] を継承し、文字列化できるように、プロパティは Constructor.prototype にインストールされます。MathJSON のようなコンストラクター以外のオブジェクトの場合、プロパティは静的プロパティとしてインストールされ、名前空間オブジェクト自体が文字列化できるようになります。コンストラクターが独自の toString メソッドを提供することもあります(例えば、Intl.Locale)。この場合、 [Symbol.toStringTag] プロパティは、明示的に Object.prototype.toString を呼び出した場合にのみ使用されます。

js
Object.prototype.toString.call(new Map()); // "[object Map]"
Object.prototype.toString.call(function* () {}); // "[object GeneratorFunction]"
Object.prototype.toString.call(Promise.resolve()); // "[object Promise]"
// … などなど

独自クラスの既定のオブジェクトタグ

クラスを作成すると、 JavaScript は既定で "Object" というタグをつけます。

js
class ValidatorClass {}

Object.prototype.toString.call(new ValidatorClass()); // "[object Object]"

toStringTag を利用して、独自のカスタムタグを設定することができるようになりました。

js
class ValidatorClass {
  get [Symbol.toStringTag]() {
    return "Validator";
  }
}

Object.prototype.toString.call(new ValidatorClass()); // "[object Validator]"

すべての DOM プロトタイプオブジェクトで利用可能な toStringTag

WebIDL の仕様変更が 2020 年半ばに行われた関係で、ブラウザーはすべての DOM プロトタイプオブジェクトに Symbol.toStringTag プロパティを追加するようになりました。例えば、HTMLButtonElementSymbol.toStringTag プロパティにアクセスするには次のようにします。

js
const test = document.createElement("button");
test.toString(); // "[object HTMLButtonElement]"
test[Symbol.toStringTag]; // "HTMLButtonElement"

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-symbol.tostringtag

ブラウザーの互換性

関連情報