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()
を参照してください。
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
にインストールされます。Math
や JSON
のようなコンストラクター以外のオブジェクトの場合、プロパティは静的プロパティとしてインストールされ、名前空間オブジェクト自体が文字列化できるようになります。コンストラクターが独自の toString
メソッドを提供することもあります(例えば、Intl.Locale
)。この場合、 [Symbol.toStringTag]
プロパティは、明示的に Object.prototype.toString
を呼び出した場合にのみ使用されます。
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" というタグをつけます。
class ValidatorClass {}
Object.prototype.toString.call(new ValidatorClass()); // "[object Object]"
toStringTag
を利用して、独自のカスタムタグを設定することができるようになりました。
class ValidatorClass {
get [Symbol.toStringTag]() {
return "Validator";
}
}
Object.prototype.toString.call(new ValidatorClass()); // "[object Validator]"
すべての DOM プロトタイプオブジェクトで利用可能な toStringTag
WebIDL の仕様変更が 2020 年半ばに行われた関係で、ブラウザーはすべての DOM プロトタイプオブジェクトに Symbol.toStringTag
プロパティを追加するようになりました。例えば、HTMLButtonElement
の Symbol.toStringTag
プロパティにアクセスするには次のようにします。
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