0Pricing
JavaScript Academy · レッスン

グローバル Symbol レジストリ

Symbol.for と keyFor で Symbol を共有します。

「グローバル Symbol レジストリ」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全4レッスンが含まれています。

共有レジストリ

グローバルシンボルレジストリを使うと、常に一意なシンボルを作るのではなく、キーによってプログラム全体で共有されるシンボルを作成できます。

const a = Symbol.for("app.id")
const b = Symbol.for("app.id")
console.log(a === b)

Symbol.for

Symbol.for は、レジストリ内で文字列キーに対応するシンボルを検索します。存在すればそれを返し、存在しなければ新しく作成して保存します。

const token = Symbol.for("token")
console.log(token.description)

共有される同一性

通常の Symbol の呼び出しとは異なり、同じキーで Symbol.for を2回呼び出すと、まったく同じシンボルが返されるため等しいと判定されます。

const x = Symbol.for("shared")
const y = Symbol.for("shared")
console.log(x === y)

Symbolとの違い

通常の Symbol は常に新しい一意なシンボルを作成しますが、Symbol.for は同じキーに対応する既存のレジストリエントリを再利用します。

const local1 = Symbol("k")
const local2 = Symbol("k")
const global1 = Symbol.for("k")
const global2 = Symbol.for("k")
console.log(local1 === local2)
console.log(global1 === global2)

Symbol.keyFor

Symbol.keyFor はその逆の処理を行います。レジストリのシンボルを渡すと、それを作成するために使われた文字列キーを返します。

const s = Symbol.for("config")
console.log(Symbol.keyFor(s))

keyForとローカルシンボル

レジストリにないシンボルに対しては Symbol.keyFor が undefined を返します。これにより、そのシンボルがグローバルかどうかを確認できます。

const local = Symbol("private")
const global = Symbol.for("public")
console.log(Symbol.keyFor(local))
console.log(Symbol.keyFor(global))

モジュール間で共有する

レジストリは別々のモジュールなど、アプリケーション内の異なる部分の間でも共有されます。そのため、あらかじめ決めた連携用キーに便利です。

function getKey() { return Symbol.for("event.bus") }
console.log(getKey() === Symbol.for("event.bus"))

命名規則

レジストリはグローバルなので、他のライブラリとの衝突を避けるためにキーへ接頭辞を付けてください。たとえば、アプリ名を名前空間として使います。

const a = Symbol.for("myapp.user.id")
const b = Symbol.for("myapp.user.id")
console.log(a === b)

レジストリは存続する

いったんキーを登録すると、プログラムの実行中は、そのキーを使った後続の Symbol.for が常に同じシンボルを返します。

Symbol.for("once")
const again = Symbol.for("once")
console.log(Symbol.keyFor(again))

レジストリを使う場面

別々のコードが名前によって同じシンボルを共有する必要がある場合は、レジストリを使います。一意性やプライバシーをより重視する場合は、通常の Symbol を使います。

const sharedFlag = Symbol.for("feature.enabled")
const privateFlag = Symbol("feature.enabled")
console.log(sharedFlag === Symbol.for("feature.enabled"))
console.log(privateFlag === Symbol.for("feature.enabled"))

オブジェクトキーと組み合わせる

レジストリのシンボルもオブジェクトキーとして使えます。これにより、連携するモジュールがシンボルを再取得して読み取れる共有メタデータを作成できます。

const META = Symbol.for("meta")
const obj = { [META]: "shared data" }
console.log(obj[Symbol.for("meta")])

クイックチェック

レジストリに関する知識を確認しましょう。

まとめ

まとめ: グローバルレジストリはキーによってシンボルを共有します。

  • Symbol.for はレジストリのシンボルを再利用するか、新しく作成します
  • 同じキーを使うと同じシンボルが返されます
  • Symbol.keyFor はキーを返し、ローカルシンボルには undefined を返します
  • 衝突を避けるため、キーに名前空間を付けます
const a = Symbol.for("k")
console.log(Symbol.keyFor(a))

よくある質問

「グローバル Symbol レジストリ」レッスンは無料ですか?

はい。「グローバル Symbol レジストリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全4レッスンが含まれています。

「グローバル Symbol レジストリ」で何を学びますか?

Symbol.for と keyFor で Symbol を共有します。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「グローバル Symbol レジストリ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 一意な Symbol を作成する
  2. オブジェクトのキーとして Symbol を使う
  3. グローバル Symbol レジストリ
  4. ウェルノウン Symbol
← JavaScript Academyに戻る