Symbol.toStringTag

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.

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

試してみましょう

ウェルノウンシンボル 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]"
// ... and more

組み込み 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"

仕様書

Specification
ECMAScript Language Specification
# sec-symbol.tostringtag

ブラウザーの互換性

BCD tables only load in the browser

関連情報