Symbol
型はJavaScript
における特殊な型であり、特に、 Symbol
型の値はすべて互いに異なります。 「Symbol」を使用して一意の値を表すことができます。 次に、 Symbol
オブジェクトを作成する例を示します。
let id = Symbol();
この方法で、 Symbol
型の値を作成し、この値を変数id
に格納します。
Symbol
タイプの変数を作成する場合、パラメータに秒属性を含む文字列を渡して、この変数の目的情報を説明できます。
例:
let id1 = Symbol('クレイジーでクールなシャオミンの ID'); let id2 = Symbol('控えめで豪華で含意のある Tingting の ID');
Symbol
タイプは常に異なります。たとえ同じ説明情報を持っていたとしても、説明は単なるラベルであり、他の目的はありません。例:
let id1 = シンボル('id'); id2 = Symbol('id'); とします。 console.log(id1==id2);//
falseラベルの意味ですが、個人的にはSymbol
内部の具体的な値を直観的に見ることができないことに関係していると思いますが、説明情報を追加することでより直感的に把握できるようになります。変数の使用についての理解。
JavaScript
ほとんどの型は出力のために文字列型に直接変換できるため、たとえば、 alert(123)
を使用して数値123
直接変換することはできません。文字列ポップアップに変換します。
ただし、 Symbol
タイプは特殊なので、次のように直接変換できません。
let id = Symbol(); alert(id);//エラー レポート、シンボル タイプを
文字列に変換できません。文字列とSymbol
は言語の混乱を防ぐための固有の「言語保護」メカニズムのため、 JavaScript
のSymbol
タイプは文字列に変換できません。本質的に異なる 違いがあり、一方を他方に変換すべきではありません。
想像してみてください。Symbol Symbol
文字列に変換できれば、一意の文字列を生成する関数になり、独立したデータ型は必要ありません。
如果我们真的想知道Symbol
变量的值,我们可以使用.toString()
方法,如下所示:
let id = Symbol('this is identification'); console.log(id.toString());//Symbol(this is ID);
または、 .description
属性を使用して説明情報を取得します。
let id = Symbol('さあ、Oli をください'); console.log(id.description);//さあ、Ollie」
JavaScript
仕様によれば、オブジェクトのプロパティ キーとして使用できるのは 2 種類の値
のみ
他の型が使用される場合、暗黙的に文字列型に変換されます。オブジェクトのキーについては前の章で詳しく説明されているため、ここでは繰り返しません。Symbol
Symbol
と、Symbol をキーとして使用する方法があります
例 1:
id = Symbol('id'); とします。 ユーザー = {} にします。 user[id] = 'id value';//シンボルキーを追加 console.log(user[id]);//id 値
例 2:
let id = Symbol('id'); ユーザー = { にします [id]:'id value',//ここの角括弧に注意してください }; console.log(user[id]);
上記の 2 つのケースは、オブジェクトにキーとしてSymbol
タイプを挿入する方法を示しています。属性にアクセスするときは、 obj.id
代わりにobj[id]
を使用する必要があることに注意してください。 obj.id
。 obj.id
obj['id']
を表すためです。
オブジェクトのキーとしてSymbol
使用するとどうなるでしょうか?
Symbol
非常明显的一个特征是,如果对象中使用Symbol
作为键,那么使用for…in
语句是访问不到Symbol
类型的属性的。
例:
let id = Symbol('id'); ユーザー = { にします 名前:「シャオミン」、 [id] : 'id', }; for (let key in user) console.log(user[key]);
Execute the above code and get the following results:
> Xiaoming
can find that the value of the [id]
object is not printed out, indicating that in the object属性リスト、 for … in
使用は、 Symbol
型のキーを自動的に無視します。
同様に、 Object.keys(user)
Symbol
型のすべてのキーを無視します。
この機能は、自分たちだけが使用できるプロパティを作成できるなど、非常に便利な効果をもたらします。
Symbol
Symbol
を直接取得する方法はありませんが、 Object.assign
メソッドですべてのプロパティをコピーできます。
obj = { にします [ID] : '123' } let obj2 = Object.assign({},obj); console.log(obj2[id]);
コピーされたオブジェクトはまだSymbol
キーを取得できないため、これはSymbol
の非表示プロパティには影響しません。
Symbol
文字列に直接変換できないため、その値を直感的に取得する方法がなく、 for … in
を通じてオブジェクトのSymbol
属性を取得することもできません。つまり、 Symbol
変数自体がなければ、オブジェクト内の対応するプロパティを取得する方法はありません。
したがって、 Symbol
タイプのキー値を使用してプロパティを非表示にすることができます。これらのプロパティには自分自身だけがアクセスでき、他の人はプロパティを見ることができません。
例:
開発プロセス中に、同僚の「Zhang San」と協力する必要があります。この Zhang San は、非常に使いやすいTool
作成しました。 Tool
は、Zhang San のTool
無料で使用したいと考えています。 、これに基づいて独自のプロパティをいくつか追加します。
Symbol
タイプのキーを追加できます:
let tools = {//Zhang San が作成したツール 用法: 「何でもできる」、 } let name = Symbol("私のツール obj"); tool[name] = "これは私のツールです"; console.log(tool[name]);
上記の例は、他の人が作成したオブジェクトに独自のプロパティを追加する方法を示していますが、なぜ通常の文字列の代わりにSymbol
タイプを使用するのでしょうか?
その理由は次のとおりです
tool
は他人が書いたコードであり、名前の競合を避けるため、原則として他人のコードを変更すべきではありません。Symbol
Symbol
異なるため、名前の競合は発生しません。Symbol
、他のユーザーのコードと競合することはありません。
Symbol
タイプを使用しない場合、次の状況が発生する可能性があります:
let tools = {//Zhang San が作成したツール 用法: 「何でもできる」、 } tool.usage = "ブンブン"; console.log(tool.usage);
上記のコードは「usage」を再利用するため、元の属性が書き換えられ、オブジェクトの本来の機能が異常になります。
すべてのSymbol
変数は、同じラベル (説明) を持つ場合でも異なります。
場合によっては、文字列名 (ラベル) を介して同じSymbol
オブジェクトにアクセスしたいことがあります。たとえば、コード内の異なる場所で同じSymbol
にアクセスします。
JavaScript
グローバルSymbol
レジストリを維持し、 Symbol
オブジェクトをレジストリに挿入し、そのオブジェクトに文字列名を付けることでオブジェクトにアクセスできます。
レジストリにSymbol
オブジェクトを挿入または読み取るには、 Symbol.for(key)
メソッドを使用する必要があります。レジストリにkey
という名前のオブジェクトがある場合は、そのオブジェクトが返されます。それ以外の場合は、新しいオブジェクトが挿入されます。戻ってきました。
例:
let id1 = Symbol.for('id');//レジストリに id という名前のシンボルがありません。作成して返します let id2 = Symbol.for('id');//という名前のシンボルがすでに存在しますレジストリ内の ID ID を持つシンボルの場合、直接 console.log(id1===id2);//true を返します。Symbol.for
Symbol.for(key)
Symbol
オブジェクトをグローバル変数として使用し、文字列を使用してオブジェクトの名前をマークします。
逆に、 Symbol.keyFor(Symbol)
使用してオブジェクトから名前を逆に取得することもできます。
例:
let id = Symbol.for('id');//レジストリに id という名前のシンボルがありません。作成して返します。 let name = Symbol.keyFor(id); console.log(name);//id
Symbol.keyFor()
関数は、グローバルSymbol
オブジェクト ( Symbol.for
を使用して挿入されたオブジェクト) でのみ使用できます。非グローバル オブジェクトで使用した場合は、 undefined
が返されます。
例:
let id = Symbol('id');//ローカルシンボル name = Symbol.keyFor(id); とします。 console.log(name);//未定義の
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
JavaScript
、多くのシステムSymbol
があります
。これらには独自の用途があります。これらの固有の変数については、後で徐々に紹介します。
Symbol
オブジェクトの値は一意です。Symbol
はfor … in
検出できないため、Symbol
ラベルを追加し、グローバル レジストリ内のオブジェクトのエンティティをクエリできますSymbol
を介したグローバル レジストリ グローバルSymbol
オブジェクト。ただし、 Symbol
Object.getOwnPropertySymbols(obj)
を通じてオブジェクトのすべてのSymbol
を取得したり、 Reflect.ownKeys(obj)
を通じてオブジェクトのすべてのキーを取得したりできます。 。