理由:オブジェクトの各プロパティ名が一意な値であることを保証するため。概念:SymbolはES6で導入された基本型であり、一意な値を表します。 Symbolが提案された時点では、オブジェクトのプロパティ名は文字列という1つの基本型しか持つことができませんでしたが、Symbolが提案された後は、オブジェクトのプロパティ名はSymbolと文字列という2つの基本型を持つことができます。
tips最初の6つのプリミティブ・データ型は以下の通りである:
1未定義
2: null
3番号
4文字列
5: ブーリアン
6オブジェクト
シンボルが作られた理由と、その背景にあるコンセプトを理解した上で、シンボルの作り方を見てみましょう。
シンボルの作成は少し特殊で、他の基本タイプとは異なり、直接作成することができます。
例 const num = 6; const s = "string"
Symbol
シンボル値はシンボル関数によって生成されます。
const symbol = Symbol();
typeof symbol Symbol」を返す。
tipsここでnewキーワードを使うことはできない。Symbolはオブジェクトではなくプリミティブ値なので、関数の前にnewキーワードを使うとエラーになるからだ!
Sybom
シンボルを作成するとき、シンボルの説明を渡すことができます。
const sに似ている = Symbol('foo')
tips:
1: 渡された値がオブジェクトの場合、toStringメソッドが呼ばれ、オブジェクトを文字列に変換してSymbol値を生成する。
2この記事は、主にSymbolの概念などを整理することを目的としている。 Symbolの説明は、主にコンソールで表示するため、あるいは文字列に変換したときに区別しやすいようにするためである。
しかし、Symbol関数は、同じ引数に対して異なるSymbol値を返す。引数に応じて同じSymbolを返したい場合は、Symbol関数を使うことができる。.for()。
let s1 = Symbol('foo');
let s2 = Symbol('foo');
s1 === s2 // false
s1.toString() //"Symbol(foo)"
一方、ES2019では、値Symbolの記述もtoStringのメソッドから呼び出す必要があるため、Symbolの記述を直接返すインスタンス・プロパティdescriptionが用意されている。
s1.description // "foo"
3Symbolの値は、他の型の値で操作することはできません、エラーを報告する。
4Symbolは文字列やブール値に変換できる。
5Symbolを数値に変換することはできない。
プロパティ名としてのSymbol
Symbolの値は等しくないという事実を利用し、Symbolの値をオブジェクトの属性名の識別子として使用することができます。
プロパティ名として使用する場合、Symbol値は角括弧またはObject.defineProperty,Reflectによってのみオブジェクトのプロパティ名に指定することができます。
tips
1ドット演算子は常に文字列が続くので、対応するシンボル値を読み取るのではなく、文字列を直接受け取るからだ。
let mySymbol = Symbol();
// 最初の書き方は
let a = {};
a[mySymbol] = 'Hello!';
// 2つ目の書き方は
let a = {
[mySymbol]: 'Hello!'
};
// 3つ目の書き方は
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 4つ目の書き方は
Reflect.defineProperty(a, mySymbol, { value: 'Hello!' });
// 上記のメソッドはすべて同じ結果を得る
a[mySymbol] // "Hello!"
属性名のトラバーサル
Symbolプロパティにトラバースしない方法
1: for...で
2: for...の
3: Object.keys()
4: Object.getOwnPropertyNames()
5: JSON.stringify()
Symbolプロパティの取得
1: Object.getOwnPropertySymbols() // 配列を返し、そのメンバは現在のオブジェクトのすべての Symbol プロパティ値です。
Symbol.forとSymbol.keyFor()
同じSymbol値を使う必要がある場合は、Symbol.for()を使います。このメソッドはパラメータとして文字列を受け取り、パラメータの名前を持つSymbol値を検索します。もしあれば、そのシンボル値を返します。なければ、文字列の名前で新しいシンボル値を作成し、グローバルに登録します。
Symbol.keyfor():登録されたSymbol型の値のキーを返します。
let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
s2はキー値を登録していないので、undefinedを返す。
,Symbol.for()Symbolの値に登録される名前は、グローバル環境で実行されるかどうかにかかわらず、グローバル環境である。
さらに、Symbolには組み込みのメソッドがあり、この記事ではその整理やSymbolの概念などに焦点を当てます。