Symbol.prototype.toString()

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.

toString() メソッドは、指定された Symbol オブジェクトを表す文字列を返します。

試してみましょう

構文

js
toString()

引数

なし。

返値

指定されたシンボル値を表す文字列です。

解説

Symbol オブジェクトは Object オブジェクトの toString メソッドをオーバーライドします。Object.prototype.toString() を継承していません。Symbol 値の場合、toString メソッドは "Symbol(description)" の形成する文字列を返します。ここで description はそのシンボルの説明です。

toString() メソッドは、this 値が Symbol プリミティブまたはラッパー・オブジェクトであることを要求されます。シンボル値への強制を試みずに、他の this 値に対して TypeError を発生します。

Symbol には [Symbol.toPrimitive]() メソッドがあるので、Symbol オブジェクトが文字列に変換されるときは、常にこのメソッドが toString() よりも優先されます。しかし、Symbol.prototype[Symbol.toPrimitive]() はシンボルプリミティブを返し、シンボルプリミティブは文字列に暗黙的に変換されると TypeError が発生するため、toString() メソッドが言語によって暗黙的に呼び出されることはありません。シンボルを文字列化するには、明示的に toString() メソッドを呼び出すか、String() 関数を使用する必要があります。

toString() の使用

js
Symbol("desc").toString(); // "Symbol(desc)"

// ウェルノウンシンボル
Symbol.iterator.toString(); // "Symbol(Symbol.iterator)"

// グローバルシンボル
Symbol.for("foo").toString(); // "Symbol(foo)"

暗黙的な toString() の呼び出し

JavaScript が toString() をシンボルラッパーオブジェクトの [Symbol.toPrimitive]() の代わりに暗黙的に呼び出すようにする唯一の方法は、先に [Symbol.toPrimitive]() メソッドを削除しておくことです。

警告: これは実際にはやってはいけません。自分が何をしているのかよく分かっていない限り、組み込みオブジェクトを決して変更しないでください。

js
delete Symbol.prototype[Symbol.toPrimitive];
console.log(`${Object(Symbol("foo"))}`); // "Symbol(foo)"

仕様書

Specification
ECMAScript Language Specification
# sec-symbol.prototype.tostring

ブラウザーの互換性

BCD tables only load in the browser

関連情報