Symbol は ES6 によって導入された新しいプリミティブデータ型であり、主な機能は次のとおりです。
-
一意性: Symbol() 関数を通じて作成された各シンボル値は一意です。たとえシンボルが同じパラメータで作成されたとしても、それらは等しくありません。
-
属性名の非表示: シンボルをオブジェクトの属性名として使用できるため、属性を非表示にすることができ、従来の方法ではアクセスできなくなります。
-
属性の名前の競合を避ける: Symbol の一意性により、 Symbolを属性名として使用することで、複数のモジュールやオブジェクト間の属性の競合を回避できます。
-
定数定義として: Symbol を使用していくつかの定数を定義し、その一意性を確保できます。
-
イテレータとジェネレータ: シンボルを使用してイテレータとジェネレータを定義できるため、オブジェクトをトラバース (横断走査) したり、ジェネレータ関数を呼び出すことができます。
-
プロパティの予期しない変更を防ぐ: Symbolによって定義されたプロパティは、オブジェクトのプロトタイプチェーン上に表示されていないため、予期しない変更はされません。
-
Symbolのビルトインプロパティ: Symbolには、オブジェクトのデフォルトのイテレータを定義するための Symbol.iterator、オブジェクトの文字列表現を定義するための Symbol.toStringTag などのいくつかのビルトインプロパティもあります。
Symbolの使用例は次のとおりです。
// Symbolの作成
const sym1 = Symbol();
const sym2 = Symbol(\"sym2\");
// プロパティ名として
const object1 = {
[symbol1]: \"value1\"
};
// プロパティ名の競合を避ける
const mod1 = {
[Symbol(\"mod1\")]: \"value1\"
};
const mod2 = {
[Symbol(\"mod2\")]: \"value2\"
};
// 定数の定義
const RETRY_TIMES = Symbol(\"retry_times\");
// イテレータとジェネレータ
const iterable = {
[Symbol.iterator]: function* () {
yield 0;
yield 1;
yield 2;
};
// プロパティが誤って変更されるのを防ぐ
Object.defineProperty(obj, sym3, { writable: false });
// ビルトインプロパティ
const object2 = {
[Symbol.toStringTag]: \"test\"
};
console.log(obj[sym1]); // 出力: \"value1\"
console.log(module1[Symbol(\"name\")]); // 出力: undefined
console.log(module2[Symbol(\"name\")]); // 出力: undefined
console.log(RETRY_TIMES); // 出力: Symbol(retry_times)
console.log([...myIterable]); // 出力: [0, 1, 2]
console.log(obj[symbol1]); // 出力:\"value\"
console.log(obj2.toString()); // 出力: \"[object MyObject]\"
上記はシンボルの役割であり、一意の値の作成、属性の非表示、属性名の競合の回避、定数、イテレータ、ジェネレータなどの定義に使用できます。 Symbolを適切に利用することで、コードの保守性やセキュリティを向上させることができます。 "