構成部品の形状
19961 ワード
📢 22/03/13復習
javascript.info, https://ko.javascript.info/symbol
simon's study, https://velog.io/@simoniful/JS-13-Symbol-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0
注意:これは個人がサイトで復習しやすいように再編成された文章です.
詳細については、リファレンスサイトにアクセスしてください.
シンボル(シンボル)は、一意の識別子(一意の識別子)を作成するために使用します.
同じ説明の2つの構成部品を作成し、比較してみましょう.同じ演算子(
JavaScriptでは、暗黙的な文字フォーマットへの変換は比較的自由です.これは、
構成部品を出力する必要がある場合は、次のように
構成部品を使用して、非表示プロファイルを作成します.非表示プロパティは、外部コードからアクセスできず、値を上書きできないプロパティです.
構成部品を使用して識別子を作成します.
もう一つの状況を仮定する.3番目のスクリプト(JavaScriptライブラリなど)では、
3番目のスクリプトでは、次の
構成部品ではなく文字列
オブジェクトテキスト
キーワードが構成部品であるPropertyは、
ただし、
前述したように、構成部品に同じ名前がある場合は、独立したものとみなされます.ただし、同じ名前の構成部品が同じオブジェクトを指す場合があります.アプリケーションは、構成部品
グローバルコンポーネントレジストリ(global symbol registry)は、このような状況のために作成されます.グローバル構成部品レジストリに構成部品を作成してアクセスすると、同じ名前の場合は常に同じ構成部品が返されます.
レジストリの構成部品を読み込むか、新しい構成部品を作成するには、
このメソッドを呼び出すと、
一部の方法は、グローバル構成部品を検索する際に使用される
すべての非グローバル構成部品は
「システムシンボル」は、JavaScriptで使用される構成部品です.システム構成部品では、オブジェクトを微調整できます.
リストの表と既知の記号のシステム構成部品を参照してください.
📌
Well Known Symbolとは、アルゴリズムに名前を付けて参照するシステム構成部品の値です.
例えば、
従来、
ここには
📚 Reference
javascript.info, https://ko.javascript.info/symbol
simon's study, https://velog.io/@simoniful/JS-13-Symbol-%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0
注意:これは個人がサイトで復習しやすいように再編成された文章です.
詳細については、リファレンスサイトにアクセスしてください.
構成部品
シンボル(シンボル)は、一意の識別子(一意の識別子)を作成するために使用します.
Symbol()
を使用して構成部品値を作成できます.// id는 새로운 심볼이 됩니다.
let id = Symbol();
構成部品を作成するときに、構成部品名という説明を追加することもできます.構成部品名は、デバッグ時に便利です.// 심볼 id에는 "id"라는 설명이 붙습니다.
let id = Symbol("id");
構成部品は一意のデータ型であるため、同じ説明の構成部品を複数作成しても、構成部品ごとに値が異なります.構成部品に貼り付けられた説明(構成部品名)は、内容に影響を与えないラベルとしてのみ機能します.同じ説明の2つの構成部品を作成し、比較してみましょう.同じ演算子(
==
)を使用して比較すると、false
が返されます.let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
🔥 構成部品は自動的に文字形式に変換されません.JavaScriptでは、暗黙的な文字フォーマットへの変換は比較的自由です.これは、
alert
関数がパラメータとしてほとんどすべての値を受け入れることができる理由です.ただし、構成部品は除外されます.構成部品シェイプの値は、暗黙的に他のデータ型に変換(自動変換)されません.let id = Symbol("id");
alert(id); // TypeError: Cannot convert a Symbol value to a string
文字列と要素が根本的に異なるため、偶然にお互いのタイプに変換することはできません.JavaScriptでは、構成部品が他のタイプに変換されないように言語保護(language guard)が提供されます.構成部品を出力する必要がある場合は、次のように
.toString()
メソッドを明示的に呼び出します.let id = Symbol("id");
alert(id.toString()); // Symbol(id)가 얼럿 창에 출력됨
symbol.description
のパーセントを使用して、説明のみを表示できます.let id = Symbol("id");
alert(id.description); // id
隠し番組
構成部品を使用して、非表示プロファイルを作成します.非表示プロパティは、外部コードからアクセスできず、値を上書きできないプロパティです.
user
という名前のオブジェクトがサードパーティコードから複数存在し、user
を使用していくつかの操作が必要であると仮定する.user
に識別子を貼りましょう.構成部品を使用して識別子を作成します.
let user = { // 서드파티 코드에서 가져온 객체
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있습니다.
しかし、文字列"id"
を鍵として使用できるのは、なぜSymbol("id")
を使用するのでしょうか.user
はサードパーティコードからインポートされたオブジェクトであり、新しいアイテムを勝手に追加することはできません.ただし、素子はサードパーティコードからアクセスできないため、当該素子を使用する際に知らないうちにサードパーティコードにuser
識別子を付与することができる.もう一つの状況を仮定する.3番目のスクリプト(JavaScriptライブラリなど)では、
user
を認識する必要があります.user
のソースコードはサードパーティコードであり、現在作成中のスクリプトとサードパーティスクリプトは互いのコードを知らないため、user
を識別する必要がある.3番目のスクリプトでは、次の
Symbol("id")
を使用して専用識別子を作成できます.// ...
let id = Symbol("id");
user[id] = "제3 스크립트 id 값";
構成部品は一意であるため、作成した識別子は3番目のスクリプトで作成した識別子と競合しません.名前が同じでも.構成部品ではなく文字列
"id"
を使用して識別子を作成すると、競合が発生する可能性があります.let user = { name: "John" };
// 문자열 "id"를 사용해 식별자를 만들었습니다.
user.id = "스크립트 id 값";
// 만약 제3의 스크립트가 우리 스크립트와 동일하게 문자열 "id"를 이용해 식별자를 만들었다면...
user.id = "제3 스크립트 id 값"
// 의도치 않게 값이 덮어 쓰여서 우리가 만든 식별자는 무의미해집니다.
Symbols in a literal
オブジェクトテキスト
{...}
を使用してオブジェクトを作成する場合は、四角カッコを使用して構成部品キーを作成する必要があります.let id = Symbol("id");
let user = {
name: "John",
[id]: 123 // "id": 123은 안됨
};
"id: 123"
の場合、文字列id
は、要素"id"
ではなくキーとなる.コンポーネントはfor...から除外
キーワードが構成部品であるPropertyは、
for..in
の繰り返し文に含まれません.let id = Symbol("id");
let user = {
name: "John",
age: 30,
[id]: 123
};
for (let key in user) alert(key); // name과 age만 출력되고, 심볼은 출력되지 않습니다.
// 심볼로 직접 접근하면 잘 작동합니다.
alert( "직접 접근한 값: " + user[id] );
Object.keys(user)
には、鍵を有するPropertyは含まれない.このような「シンボル属性の非表示」と呼ばれる原則は、外部スクリプトまたはライブラリが素子鍵を持つプログラムにアクセスできないようにします.ただし、
Object.assign
は、鍵が構成部品であるPropertyを排除することなく、オブジェクト内のすべてのPropertyをコピーします.let id = Symbol("id");
let user = {
[id]: 123
};
let clone = Object.assign({}, user);
alert( clone[id] ); // 123
矛盾しているように見えますが、これは意図的に設計されています.オブジェクトのコピーまたはマージには、通常、id
などの要素を含むすべてのプログラムを使用する必要があります.グローバル構成部品
前述したように、構成部品に同じ名前がある場合は、独立したものとみなされます.ただし、同じ名前の構成部品が同じオブジェクトを指す場合があります.アプリケーションは、構成部品
"id"
を使用して特定のプログラムにアクセスする必要があるとします.グローバルコンポーネントレジストリ(global symbol registry)は、このような状況のために作成されます.グローバル構成部品レジストリに構成部品を作成してアクセスすると、同じ名前の場合は常に同じ構成部品が返されます.
レジストリの構成部品を読み込むか、新しい構成部品を作成するには、
Symbol.for(key)
を使用します.このメソッドを呼び出すと、
key
という名前の構成部品が返されます.条件を満たす構成部品がレジストリにない場合、新しい構成部品Symbol(key)
が作成され、レジストリに保存されます.// 전역 레지스트리에서 심볼을 읽습니다.
let id = Symbol.for("id"); // 심볼이 존재하지 않으면 새로운 심볼을 만듭니다.
// 동일한 이름을 이용해 심볼을 다시 읽습니다(좀 더 멀리 떨어진 코드에서도 가능합니다).
let idAgain = Symbol.for("id");
// 두 심볼은 같습니다.
alert( id === idAgain ); // true
グローバル構成部品レジストリの構成部品をグローバル構成部品と呼びます.アプリケーションでこれらの構成部品を大量に使用する必要がある場合は、グローバル構成部品を使用します.Symbol.keyFor
一部の方法は、グローバル構成部品を検索する際に使用される
Symbol.for(key)
とは逆である.Symbol.keyFor(sym)
を使用して名前を取得します.// 이름을 이용해 심볼을 찾음
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// 심볼을 이용해 이름을 얻음
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
Symbol.keyFor
は、グローバル構成部品レジストリを検索することによって構成部品の名前を取得する.検索範囲はグローバル構成部品レジストリなので、非グローバル構成部品では使用できません.パラメータがグローバル要素でない場合、Symbol.keyFor
はundefined
を返します.すべての非グローバル構成部品は
description
パーセントである.通常の構成部品から名前を取得するには、description
のパーセントを使用します.let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");
alert( Symbol.keyFor(globalSymbol) ); // name, 전역 심볼
alert( Symbol.keyFor(localSymbol) ); // undefined, 전역 심볼이 아님
alert( localSymbol.description ); // name
システム構成部品
「システムシンボル」は、JavaScriptで使用される構成部品です.システム構成部品では、オブジェクトを微調整できます.
リストの表と既知の記号のシステム構成部品を参照してください.
📌
Symbol.hasInstance
📌 Symbol.isConcatSpreadable
📌 Symbol.iterator
📌 Symbol.toPrimitive
📌 ...Well Known Symbol
Well Known Symbolとは、アルゴリズムに名前を付けて参照するシステム構成部品の値です.
@@
は、Well Known Symbolを表す記号である.@@match
とSymbol.match
は同一形態であり,specでは@@match
形態,開発者ではSymbol.match
形態を用いた.match()
メソッドを実行すると、デバッガを使用して@@match
が実行されます.ソースコードにSymbol.match
が作成された場合、@@match
は実行されず、Symbol.match
が最初に実行されます.例えば、
String.prototype.match
が呼び出されると、まず開発者コードでSymbol.match
が検索される.成功した場合は、この関数を実行します.ただし、見つからない場合は、デバッガ@@match
を実行します.従来、
Symbol.XXXX
は単独で提供されていなかったため、エンジンは直ちに@@XXXX
アルゴリズムを呼び出した.ただし、開発者が使用できるようになりました(変更、追加).開発者コードを使用してデバッガ機能を上書きできます.ここには
Symbol
項目が開発者が作成したコードです.対応する部分の関数およびアルゴリズムが実行される場合、まずSymbol
エントリで関連コンテンツが上書きされると、このコードが実行され、そうでない場合、エンジンのデフォルトアルゴリズムが呼び出される.Reference
この問題について(構成部品の形状), 我々は、より多くの情報をここで見つけました https://velog.io/@gusdnr814/심볼형テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol