グローバル 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 一意な Symbol を作成する
- オブジェクトのキーとして Symbol を使う
- グローバル Symbol レジストリ
- ウェルノウン Symbol