JavaScript シンボル


JavaScript では、オブジェクト キーは文字列または記号のいずれかにのみ含めることができます.

A symbol represents a unique identifier



シンボルを作成するための構文は次のとおりです.

id = Symbol()


説明付きのシンボル (シンボル名) を作成するための構文は次のとおりです.

id = Symbol("description")


説明は、オブジェクトに固有の単なるラベルです.

同じ説明のシンボルでも異なることに注意することが重要です.

以下の例を参照してください.

const id1 = Symbol("description");
const id2 = Symbol("description");

console.log(id1 === id2); // false


シンボルは文字列への自動変換 (強制) を許可しないことに注意することも重要です.

以下の例を参照してください.

const id3 = Symbol("description");
alert(id3); // TypeError...


変換を行うには、toString() 関数を使用します.

以下の例を参照してください.

const id4 = Symbol("id");
alert(typeof id4.toString); // string


または、id.description を使用して説明のみを表示することもできます.

let id5 = Symbol("id");
alert(id5.description, toString id5.description); // id string



隠しプロパティ



シンボルを使用すると、オブジェクトの隠しプロパティを作成できます.
以下の例を参照してください.

const person = { // belongs to another code
  name: "Bello"
};

let id = Symbol("id");

person[id] = 4; // added id key to user object

alert( person[id] ); // 4 => accessed data by the symbol as the key


上記のコードは、コードのどの部分からも誤ってシンボルにアクセスできないことを示しています.

文字列が記号の代わりに使用される場合、最後の文字列「id」は、スクリプトまたは別の JavaScript ライブラリ スクリプトの以前の文字列 ID によって上書き (上書き) されます.

以下の例を参照してください.

const person = { name: "John" };

// my script uses "id" property
person.id = "id value before the last script";

// library script uses the "id" property
person.id = "id value in last script" // overwritten by another script!
console.log(person.id); // id value in last script



キーとしてのシンボル ID



オブジェクト リテラルで記号をキーとして使用するには、記号を角かっこで囲む必要があります.

const id = Symbol("id");

const user = {
  name: "John",
  [id]: 639 // not "id": 639
};



シンボルキーの複製



for...in は、オブジェクト内のシンボル キーをスキップします.
以下の例を参照してください.

const id = Symbol("id");
const user = {
  name: "Bello",
  age: 27,
  [id]: 396
};

for (let key in user) {
  console.log(key); // name, age => no symbols
}
// Object.keys(user) also skips them.

Object.assign は、文字列とシンボルの両方のプロパティをコピーします.

以下の例を参照してください.

const id = Symbol("id");
const user = {
  name: "Bello",
  age: 27,
  [id]: 396
};

let clone = Object.assign({}, user);
alert( clone[id] ); // 396



グローバル シンボル レジストリ



シンボルは、同じ記述であっても、デフォルトでは常に異なりますが、プログラム内でとにかく同じエンティティの同じ名前のシンボルを使用したい場合があります.

これを実現するために、Symbol.for(key) を使用してグローバル シンボル レジストリを作成し、同じ名前で繰り返しアクセスしてまったく同じシンボルを返すようにします.

以下の例を参照してください.

const id1 = Symbol.for("id"); // if the symbol did not exist, it is created
const id2 = Symbol.for("id");

console.log( id1 === id2); // true => the same symbol


Symbols inside the registry are called global symbols.




Symbol.keyFor



Symbol.for の逆は Symbol.keyFor で、名前をグローバル シンボルで返します.

以下の例を参照してください.

// get symbol by name
const sym1 = Symbol.for("id1");
const sym2 = Symbol.for("id2");

// get name by symbol
console.log( Symbol.keyFor(sym1) ); // id1
console.log( Symbol.keyFor(sym2) ); // id2


The Symbol.keyFor internally uses the global symbol registry to look up the key for the symbol. If the symbol is not global, it returns undefined



以下の例を参照してください.

const globalSymbol = Symbol.for("globalName");
const localSymbol = Symbol("localName");

console.log( Symbol.keyFor(globalSymbol) ); // globalName => global symbol
console.log( Symbol.keyFor(localSymbol) ); // undefined => not global

console.log( localSymbol.description ); // localName



システム記号



内部的には、さまざまな JavaScript システム シンボルがあります.
以下はその一部です.
  • Symbol.hasInstance
  • Symbol.isConcatSpreadable
  • Symbol.iterator
  • Symbol.toPrimitive

  • MDN の完全なリストを確認してください `