JavaScriptのSymbol.for()は、グローバルなシンボルレジストリを使用してシンボルを共有するための強力な機能です。この記事では、Symbol.for()の基本的な使い方と実践的な例を紹介します。

Symbol.for()とは

Symbol.for()は、指定したキーに対応するシンボルをグローバルシンボルレジストリから検索し、存在しない場合は新しいシンボルを作成して返す関数です。

const sym1 = Symbol.for('mySymbol');
const sym2 = Symbol.for('mySymbol');

console.log(sym1 === sym2); // true

通常のSymbol()との違い

通常のSymbol()は、毎回新しいユニークなシンボルを作成します。

const s1 = Symbol('test');
const s2 = Symbol('test');

console.log(s1 === s2); // false

// 一方、Symbol.for()は同じキーなら同じシンボルを返す
const shared1 = Symbol.for('test');
const shared2 = Symbol.for('test');

console.log(shared1 === shared2); // true

Symbol.keyFor()でキーを取得

Symbol.keyFor()を使用すると、Symbol.for()で作成したシンボルのキーを取得できます。

const sym = Symbol.for('myKey');
console.log(Symbol.keyFor(sym)); // 'myKey'

// 通常のSymbolではundefinedが返される
const regularSym = Symbol('myKey');
console.log(Symbol.keyFor(regularSym)); // undefined

実践的な使用例

1. アプリケーション全体での定数の共有

// モジュール1
const EVENT_TYPE = Symbol.for('USER_LOGIN');

// モジュール2
function handleEvent(type) {
    if (type === Symbol.for('USER_LOGIN')) {
        console.log('ユーザーログインイベントを処理');
    }
}

2. プラグインシステムでの識別子

class Plugin {
    constructor(name) {
        this.id = Symbol.for(`plugin_${name}`);
    }
}

const plugin1 = new Plugin('auth');
const plugin2 = new Plugin('auth');
console.log(plugin1.id === plugin2.id); // true

注意点

1. グローバルシンボルレジストリは共有されるため、キーの命名には注意が必要です。

2. Symbol.for()は必ずstring型のキーを受け取ります。

3. パフォーマンスの観点から、必要な場合のみSymbol.for()を使用することをお勧めします。

まとめ

Symbol.for()は、JavaScriptアプリケーション全体で一意のシンボルを共有したい場合に非常に便利な機能です。適切に使用することで、安全でメンテナンス性の高いコードを書くことができます。