javascript basics #7 Symbol type
16931 ワード
javascript basics #7 Symbol type
このヒントはJavaScriptですinfo/symbolで作成します.
仕様によっては、JavaScriptオブジェクトアイテムの鍵は、
これまで
上記のようにSymbolを作成できます.
Symbolを作成するときに、
Symbolは一意の識別子であり、同じ記述(symbol name)を有していても異なる値である.descriptionはラベルとしてのみ機能し、コンテンツには影響しません.
例えば、以下に同じ説明を有する2つの要素があるが、それらは等しくない.
JavaScriptのほとんどの数値は、文字列への暗黙的な変換をサポートします.ただし、Symbolでは文字列自動変換はサポートされていません.
したがって、以下に示すように、
自動変換がサポートされていないのは、「languard」の言語乱用を防ぐためだ.
Symbolを出力する場合は、
Symbolでは、非表示のプロパティを作成できます.他のコードは、この非表示のプログラムに偶然アクセスまたは上書きすることはできません.
既存の
逆に、
以上から分かるように、Symbolは同じ名前を持っているが、それらは異なるSymbolと見なされている.しかし、同じ素子が必要になることもあります.
グローバルSymbolは
もう一つはJavaScript内部で使われている
有名なSymbol Tableには、次のものがあります. 他など... 例えば、
言語に関するさまざまな特性を学び、他のSymbolを熟知します.
同じ名前であっても、非表示オブジェクトアイテムを作成する場合( JavaScriptの内部で使用する
技術的には、
このヒントはJavaScriptですinfo/symbolで作成します.
仕様によっては、JavaScriptオブジェクトアイテムの鍵は、
String
とSymbol
のいずれかにのみ指定できます.数字はだめで、ブール値もだめです.これまで
String
万しか使われていませんでした.では、Symbol
の長所を見てみましょう.Symbolとは?
Symbol
は一意の識別子です.Symbolの作成方法
let id = Symbol();
上記のようにSymbolを作成できます.
Symbolを作成するときに、
description
を作成することもできます.これをsymbol name
と呼びます.Symbolは一意の識別子であり、同じ記述(symbol name)を有していても異なる値である.descriptionはラベルとしてのみ機能し、コンテンツには影響しません.
例えば、以下に同じ説明を有する2つの要素があるが、それらは等しくない.
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
rubyのような言語(symbolというキーワードを使用する)を熟知している場合は、JavaScriptのsymbolと混同しないように注意してください.JavaScriptの記号は、他の言語の記号とは異なります.Symbolは文字列に自動的に変換されません
JavaScriptのほとんどの数値は、文字列への暗黙的な変換をサポートします.ただし、Symbolでは文字列自動変換はサポートされていません.
したがって、以下に示すように、
alert
コードを記述するとエラーが発生する.let id = Symbol("id");
alert(id);
自動変換がサポートされていないのは、「languard」の言語乱用を防ぐためだ.
Symbolを出力する場合は、
.toString()
を直接貼り付けてください.let id = Symbol("id");
alert(id.toString());
またはsymbol.description
を使用することができる.alert(id.description);
非表示のアイテム群の作成
Symbolでは、非表示のプロパティを作成できます.他のコードは、この非表示のプログラムに偶然アクセスまたは上書きすることはできません.
let user = { // 다른 코드에 속함
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 심볼을 키로 이용하여 접근 가능
外部からのインポートなど、Third-party Code
にタッチすると、非表示のプロパティ機能が便利です.既存の
Third-part
で作成されたオブジェクトのプロジェクト名を考慮する必要はありません.必要な新しいプロジェクトを任意に登録したり、他の場所でうっかりアクセスしたりする心配はありません.// ...
let id = Symbol("id");
user[id] = "Some Value";
コンポーネントをオブジェクトツリーに配置する
let id = Symbol("id");
let user = {
name: "John",
[id]: 123
};
for in Symbol Property省略
for..in
サイクルでSymbol Propertyを省略します.let id = Symbol("id");
let user = {
name: "John",
age: 30,
[id]: 123
};
for (let key in user) alert(key); // name, age without symbol
// the direct access by the symbol works
alert( "Direct: " + user[id] );
Object.keys(user)
でもSymbol Propertyは現れません.したがって、Symbolプロジェクトは、スクリプトまたはライブラリループのいずれにおいても、オブジェクトに偶然アクセスすることはありません.逆に、
Object.assign
を使用してオブジェクトをコピーすると、Symbol投影にコピーされます.let id = Symbol("id");
let user = {
[id]: 123
};
let clone = Object.assign({}, user);
alert(clone[id]); // 123
このコードは最初にJavaScriptの意図に従って処理された.通常、オブジェクトをコピーする場合は、すべて投影にコピーします.グローバルSymbol
以上から分かるように、Symbolは同じ名前を持っているが、それらは異なるSymbolと見なされている.しかし、同じ素子が必要になることもあります.
"id"
という記号を作成し、同じpropertyを指す場合はどうすればいいですか?グローバルSymbolは
Symbol.for
をサポートします.この空間をglobal symbol registryと呼ぶ.ここでSymbolを登録し、後でアクセスできます.Symbol.for(key)
の形式でこの使い方にアクセスできます.// read from the global registry
let id = Symbol.for("id"); // if the symbol did not exist, it is created
// read it again (maybe from another part of the code)
let idAgain = Symbol.for("id");
// the same symbol
alert(id === idAgain); // true
この方式はRuby言語で使われるSymbolの形式に似ている.Symbol.keyFor
Symbol.for(key)
が返すSymbolがkey
であれば、Symbol.keyFor(symbol)
Symbolに従ってkey
を返します.// get symbol by name
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// get name by symbol
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
もちろん、非グローバルシンボル(non-global)を追加するとundefined
に戻りますが、正しく動作しません.let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); // name, global symbol
alert( Symbol.keyFor(localSymbol) ); // undefined, not global
alert( localSymbol.description); // name
System Symbol
もう一つはJavaScript内部で使われている
"System Symbol"
です.fine-tune
を使用して、さまざまな面から私たちのオブジェクトを知ることができます.有名なSymbol Tableには、次のものがあります.
"System Symbol"
Symbol.hasInstance
Symbol.isConcatSpreadable
Symbol.iterator
Symbol.toPrimitive
は、Symbol.toPrimitive
をobject
に変換することを可能にする.言語に関するさまざまな特性を学び、他のSymbolを熟知します.
サマリ
primitive
は元のタイプであり、一意の識別子である.Symbol
を呼び出すことによって作成することができる.同じ名前であっても、
Symbol()
は常に異なる値とみなされます.同じ名前のSymbol
を作成するには、Symbol
を使用する必要があります.Symbol.for(key)
には、以下の主な使用例があります.Symbol
またはfor...in
も必要ありません).Object.keys
を使用してSymbol.*
を実装したい場合(後でbuilt-in behaviors
を使用してSymbol.iterator
の値を生成します)、iterable
を使用してSymbol.toPrimitive
を変換してみます.技術的には、
object-to-primitive
は100%隠されていない.Symbol
、すなわちbuilt-in Method
を使用して、対象スキームのすべてのObject.getOwnPropertySymbol(obj)
を得ることができる.また、Symbol
は、Reflect.ownKeys(obj)
によって記述されたすべてのPropertyを返す.しかし、ほとんどのライブラリ、Symbol
、およびbuilt-in functions
では、これらの方法は使用されません.Reference
この問題について(javascript basics #7 Symbol type), 我々は、より多くの情報をここで見つけました https://velog.io/@jakeseo_me/javascript-basics-7-Symbol-typeテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol