導入シンボル変数を作成する最も簡単な方法は、Symbol() 関数を使用することです。 sysmbol 変数には 2 つの特別な機能があります。 1. オブジェクト属性名として使用できます。オブジェクト属性名として使用できるのは、文字列型とシンボル型のみです。 2. 2 つのシンボルが同じ値を持つことはありません。 const シンボル1 = シンボル(); const シンボル2 = シンボル(); シンボル1 === シンボル2; // 偽 定数obj = {}; obj[symbol1] = 'こんにちは'; obj[symbol2] = 'ワールド'; obj[シンボル1]; // 'こんにちは' obj[symbol2]; // 'ワールド' Symbol() を呼び出すとオブジェクトのように見えますが、シンボルは実際には JavaScript のプリミティブ データ型です。 Symbol をコンストラクターとして new を使用すると、エラーが発生します。 const シンボル1 = シンボル(); typeof symbol1; // 'シンボル' symbol1 instanceof Object; // false // "TypeError: シンボルはコンストラクタではありません" をスローします 新しいシンボル(); 説明Symbol() 関数は、文字列の説明という 1 つのパラメータのみを取ります。この文字列パラメータの唯一の用途は、デバッグを支援すること、つまりその toString() 値です。ただし、同じ説明を持つ 2 つのシンボルは等しくないことに注意してください。 const symbol1 = Symbol('私のシンボル'); const symbol2 = Symbol('私のシンボル'); シンボル1 === シンボル2; // 偽 console.log(symbol1); // 'Symbol(私のシンボル)' グローバル シンボル レジストリがあり、Symbol.for() で作成されたシンボルはこのレジストリに追加され、その説明を使用してインデックスが付けられます。つまり、Symbol.for() を使用して同じ説明を持つ 2 つのシンボルを作成した場合、それらは等しくなります。 const symbol1 = Symbol.for('test'); const symbol2 = Symbol.for('test'); シンボル1 === シンボル2; // 真 console.log(symbol1); // 'シンボル(テスト)' 一般的に、名前の競合が発生する可能性があるため、特別な理由がない限り、グローバル レジストリを使用しないでください。 名前の競合JavaScript には組み込みシンボルがあり、ES6 では Symbol.iterator です。 Symbol.iterator 関数を持つオブジェクトは反復可能オブジェクトと呼ばれ、オブジェクトに対して for/of ループを使用できることを意味します。 定数フィボナッチ = { [シンボル.イテレータ]: 関数*() { a = 1 とします。 b = 1 とします。 温度を調節する b を生成します。 (真)の間{ 温度 = ; a = a + b; b = 温度; b を生成します。 } } }; // 100 未満のすべてのフィボナッチ数を出力します (フィボナッチの定数x) { (x >= 100)の場合{ 壊す; } コンソールログ(x); } ここで文字列ではなく Symbol.iterator を使用するのはなぜですか? Symbol.iterator が使用されていないと仮定すると、反復可能なオブジェクトには、次の反復可能なオブジェクト クラスのように、'iterator' という名前の文字列属性が必要です。 クラス MyClass { コンストラクタ(obj) { オブジェクトに代入します。 } イテレータ() { const keys = Object.keys(this); i = 0 とします。 戻り値 (関数*() { i >= キーの長さの場合{ 戻る; } keys[i++]を生成します。 })(); } } MyClass のインスタンスは反復可能なオブジェクトであり、オブジェクトのプロパティを走査できます。しかし、上記のクラスには潜在的な欠陥があります。悪意のあるユーザーが、反復子プロパティを持つオブジェクトを MyClass コンストラクターに渡すとします。 const obj = new MyClass({ iterator: '関数ではありません' }); このように、obj に対して for/of を使用すると、JavaScript は TypeError: obj is not iterable 例外をスローします。オブジェクトに渡されたイテレータ関数がクラスのイテレータ プロパティをオーバーライドしていることがわかります。これは、プロトタイプ汚染のセキュリティ問題に多少似ています。ユーザーデータを無意識にコピーすると、__proto__ やコンストラクターなどの一部の特殊なプロパティに問題が発生します。 ここで重要な点は、シンボルがオブジェクトの内部データとユーザー データを分離して保持することです。 sysmbol は JSON で表現できないため、不適切な Symbol.iterator プロパティを持つデータを Express API に渡すことについて心配する必要はありません。さらに、Mongoose モデルなど、組み込み関数とユーザー データを混在させるオブジェクトの場合、シンボルを使用して、ユーザー データが組み込み属性と競合しないようにすることができます。 私有財産2 つのシンボルは等しくないため、JavaScript でプライベート プロパティをシミュレートするために簡単に使用できます。シンボルは Object.keys() の結果には表示されないため、シンボルを明示的にエクスポートするか、Object.getOwnPropertySymbols() を使用して取得しない限り、他のコードはこのプロパティにアクセスできません。 関数 getObj() { const シンボル = シンボル('テスト'); 定数obj = {}; obj[シンボル] = 'テスト'; obj を返します。 } 定数obj = getObj(); オブジェクト.keys(obj); // [] // このシンボルへの参照がない限り、このプロパティにアクセスすることはできません obj[Symbol('test')]; // undefined // getOwnPropertySymbols() を使用して、シンボルへの参照を取得します。const [symbol] = Object.getOwnPropertySymbols(obj); obj[シンボル]; // 'テスト' もう 1 つの理由は、シンボルが JSON.stringify() の結果に表示されないことです。より正確に言うと、JSON.stringify() はシンボルの属性名と属性値を無視します。 const シンボル = シンボル('テスト'); const obj = { [シンボル]: 'テスト', テスト: シンボル }; JSON.stringify(obj); // "{}" 要約するオブジェクトの内部状態を表すためにシンボルを使用すると、ユーザー データとプログラムの状態を効果的に分離できます。これにより、内部プロパティを「$」で始めるなどの特定の命名規則は必要なくなります。次回プライベート プロパティを定義する必要がある場合は、Symbol 型を試してください。 上記は、JavaScript プリミティブ データ型 Symbol の詳細な説明です。JavaScript プリミティブ データ型 Symbol の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: mysql8.0.0 winx64.zip 解凍バージョンのインストールと設定のチュートリアル
>>: Linux でローカル コンピューターとリモート サーバーのポートが接続されているかどうかを確認する方法
まず、Vue-cli をインストールする必要があります。 npm インストール -g vue-cli...
これは私が以前使用した mysql5.7.18.zip のインストール チュートリアルです。まずこれ...
VMware Toolsをインストールすると、仮想マシンホスト間で①テキストをコピーして貼り付けるこ...
目次1. 複雑なページデータ領域をコンポーネントにカプセル化する2. 大きな画像の使用を避ける3. ...
1 / Webプロジェクトファイルをwebappsディレクトリに直接コピーするこれは最も一般的に使...
この間、私は docker を勉強していたのですが、nginx をデプロイするときに行き詰まりました...
入力タイプ「file」とは何ですか?これが何なのかは説明する必要はないと思います。誰もが知っているこ...
最近では、多くのウェブサイトでは、ページ上の特定のコンテンツや情報を直接コピーすることは許可されてお...
HTML5 では、ヘッダー、フッター、ナビゲーションなどのセマンティック タグが追加されているため...
目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...
リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...
MySQL バージョン 5.0 ではストアド プロシージャのサポートが開始されました。ストアド プロ...
HTML コード内の連続するスペースまたは空白行 (改行) はすべて 1 つのスペースとして表示され...
現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...
目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...