ES6アクション:シンボルとその用途
ES2015では、開発者が長い間期待していたいくつかの言語機能を紹介しますが、シンボルなど、明らかではないあまり知られていない機能も紹介します。
シンボルは、新しいプリミティブデータ型であり、他のシンボルと競合しないことが保証されている一意のタグです。この意味で、シンボルをuuidの一種(普遍的な一意の識別子)と考えることができます。シンボルがどのように機能し、何ができるか見てみましょう。
キーポイント
- ES6は、新しいプリミティブデータ型シンボルを導入します。これは、他のシンボルと競合することのない一意のタグであり、クラス/モジュール定数として文字列または整数に代わる優れた代替品になります。
- シンボルは、オブジェクト属性キーとして使用でき、既存の属性やメソッドと競合しない一意のキーを提供し、オブジェクトがシリアル化されているときにこれらのキーを含めません。
- パブリックシンボルは、特定の言語機能(Iteratorなど)の動作をカスタマイズし、新しい機能を実装するために使用されるシンボル関数の事前定義されたプロパティです。
- ES6には、ドキュメントや組み込みのIFRAMEまたはサービスワーカーなどのさまざまな実行コンテキストでシンボルのストレージと取得を可能にするグローバルシンボルレジストリが含まれています。
新しいシンボルを作成
新しいシンボルを作成することは非常にシンプルで、シンボル関数を呼び出すだけです。これは、オブジェクトコンストラクターではなく、単なる標準関数であることに注意してください。新しいオペレーターでそれを呼び出そうとすると、TypeRRORが得られます。シンボル関数を呼び出すたびに、新しい完全にユニークな値が得られます。
const foo = Symbol(); const bar = Symbol(); foo === bar // false
最初のパラメーターとして文字列を渡すことにより、タグ付き記号を作成することもできます。タグはシンボルの値には影響しませんが、デバッグに役立ち、シンボルのtoStringメソッドが呼び出されるとタグが表示されます。同じタグで複数のシンボルを作成できますが、これには利点がなく、混乱につながる可能性があります。
let foo = Symbol('baz'); let bar = Symbol('baz'); foo === bar // false // console.log(foo); // Symbol(baz)
シンボルの目的
文字列と整数は一意の値ではありません。たとえば、2番目または文字列「開発」も、プログラムの他の場所でさまざまな目的で使用できます。シンボルを使用すると、提供された値に自信を持つことができます。
class Application { constructor(mode) { switch (mode) { case Application.DEV: // 设置开发环境的应用程序 break; case Application.PROD: // 设置生产环境的应用程序 break; default: throw new Error('无效的应用程序模式:' + mode); } } } Application.DEV = Symbol('dev'); Application.PROD = Symbol('prod'); // 使用示例 const app = new Application(Application.DEV);
シンボルのもう1つの興味深い使用は、オブジェクト属性キーとしてです。 JavaScriptオブジェクトをハッシュマップとして使用したことがある場合(PHP用語のAssociation Arrays and Python用語の辞書)、正方形のブラケット表記を使用してプロパティを取得/設定することに精通しています。
const foo = Symbol(); const bar = Symbol(); foo === bar // false
四角いブラケット表記を使用すると、属性キーとしてシンボルを使用することもできます。これを行うことにはいくつかの利点があります。まず、オブジェクトの既存のプロパティやメソッドと競合する可能性のある文字列キーとは異なり、シンボルベースのキーが競合しないことを確認できます。第二に、それらはfor ... loopで列挙されておらず、object.keys()、object.getownpropertynames()、json.stringify()などの関数によって無視されます。これにより、オブジェクトをシリアル化するときに含めたくないプロパティに最適になります。
let foo = Symbol('baz'); let bar = Symbol('baz'); foo === bar // false // console.log(foo); // Symbol(baz)
class Application { constructor(mode) { switch (mode) { case Application.DEV: // 设置开发环境的应用程序 break; case Application.PROD: // 设置生产环境的应用程序 break; default: throw new Error('无效的应用程序模式:' + mode); } } } Application.DEV = Symbol('dev'); Application.PROD = Symbol('prod'); // 使用示例 const app = new Application(Application.DEV);
パブリックシンボル
シンボルキープロパティは、ES6の前にコードに実際には見えません。既存のタイプのJavaScriptに逆方向の互換性を破ることなく新しい機能を追加するのに最適です。いわゆる「パブリック」シンボルは、特定の言語機能の動作をカスタマイズし、イテレーターなどの新しい関数を実装するために使用されるシンボル関数の事前定義されたプロパティです。symbol.iteratorは、反復を可能にするオブジェクトに特別な方法を割り当てるために使用されるパブリックシンボルです。
組み込みタイプの文字列、Array、Map、およびSETは、これらのタイプのインスタンスをfor ...または拡張機能を使用するときに呼び出されるデフォルトのシンボルメソッドを持っています。また、ブラウザはSymbol.iteratorキーの使用を開始して、同じ方法でDOM構造(NodeListやHTMLCollectionなど)を繰り返すことができます。
const data = []; data['name'] = 'Ted Mosby'; data['nickname'] = 'Teddy Westside'; data['city'] = 'New York';
仕様は、ランタイム全体のシンボルレジストリも定義します。つまり、ドキュメントと組み込みのiframeまたはサービスワーカーの間など、さまざまな実行コンテキストでシンボルを保存および取得できます。
symbol.for(key)レジストリから指定されたキーのシンボルを取得します。キーがシンボルが存在しない場合、新しいシンボルが返されます。ご想像のとおり、同じキーへの後続の呼び出しは同じシンボルを返します。
symbol.keyfor(シンボル)を使用すると、特定のシンボルのキーを取得できます。レジストリに存在しないシンボルでメソッドを呼び出すと、未定義に戻ります:
const user = {}; const email = Symbol(); user.name = 'Fred'; user.age = 30; user[email] = 'fred@example.com'; Object.keys(user); // ['name', 'age'] Object.getOwnPropertyNames(user); // ['name', 'age'] JSON.stringify(user); // {"name":"Fred","age":30}
一部のユースケースでは、シンボルを使用すると利点があります。前の記事で言及されている1つのユースケースは、オブジェクトがシリアル化されたときに含まれないオブジェクトに「非表示」プロパティを追加する場合です。
ライブラリの著者は、シンボルを使用して、既存のキー(またはそのキーが他のコードによって上書きされることを心配することなく、クライアントオブジェクトにプロパティまたはメソッドを安全に追加することもできます。たとえば、ウィジェットコンポーネント(日付セレクターなど)は、多くの場合、さまざまなオプションを使用して初期化され、州に保存する必要があります。プロパティが別のキーと競合する可能性があるため、ウィジェットインスタンスをDOM要素オブジェクトに割り当てることは理想的ではありません。シンボルベースのキーを使用すると、この問題を巧みに回避し、ウィジェットインスタンスが上書きされないようにします。 Mozilla Hacksのブログ投稿ES6の詳細については、詳細をご覧ください:シンボル。
ブラウザサポート
シンボルを試してみたい場合は、主流のブラウザのサポートは非常に優れています。ご覧のとおり、Chrome、Firefox、Microsoft Edge、およびOperaの現在のバージョンはすべて、モバイルデバイスのAndroid 5.1とiOS 9だけでなく、シンボルタイプをネイティブにサポートしています。古いブラウザをサポートする必要がある場合は、PolyFillを使用することもできます。
結論
シンボルを導入する主な理由は、既存のコードを壊すことなく新しい機能を言語に追加することを促進することですが、興味深い用途があります。すべての開発者は、少なくともそれらの基本的な理解を持ち、最も一般的に使用されるパブリックシンボルとその用途に精通している必要があります。
ES6記号 ES6シンボルの実際の使用は何ですか? ES6シンボルは、ES6(ECMAScript 6)で導入された新しいプリミティブデータ型です。これらは、オブジェクトプロパティの識別子として使用できるユニークで不変のデータ型です。それらを使用して、オブジェクトの私有地を作成し、メタレベルのプログラミングの概念を実装し、競合の命名を避けることができます。また、オブジェクトのカスタム反復動作を定義するためにも使用できます。JavaScriptで新しいシンボルを作成する方法は?
シンボル()関数を使用して、新しいシンボルを作成できます。この関数は、たとえ同じ引数を渡す場合でも、呼び出されるたびに一意のシンボルを返します。たとえば、ここでは
、Symbol1とsymbol2は、同じパラメーター「シンボル」がシンボル()関数に渡された場合でも、異なるシンボルです。シンボルをオブジェクトキーとして使用する方法は?
let symbol1 = Symbol('symbol'); let symbol2 = Symbol('symbol');
正方形の括弧内のシンボルをオブジェクトキーとして使用できます。たとえば、
JavaScriptのグローバルシンボルレジストリは何ですか?
let symbol = Symbol('key'); let obj = {}; obj[symbol] = 'value';
グローバルシンボルレジストリは、IFRAMEやサービスワーカーなどのさまざまな領域でシンボルを作成、アクセス、共有できる共有環境です。 symbol.for(key)を使用してグローバルレジストリにシンボルを作成し、symbol.keyfor(symbol)を使用してアクセスできます。
オブジェクトでシンボルを使用する方法は?
オブジェクトを備えたシンボルを使用して、一意のキーを作成できます。これは、シンボルが常に一意であるため、命名の競合を回避するのに役立ちます。たとえば、let symbol = Symbol('key'); let obj = { [symbol]: 'value' };
ここでは、シンボル「シンボル」はオブジェクト「OBJ」のキーとして使用されます。
シンボルを文字列に変換できますか?
はい、toString()メソッドを呼び出すことで、シンボルを文字列に変換できます。これは、「記号(説明)」という形式の文字列を返します。ここで、「説明」はシンボル()関数に渡すオプションの説明です。
シンボルは配列で使用できますか?
はい、配列付きシンボルを使用できます。たとえば、シンボルを一意の属性キーとして使用して、アレイに関するメタデータを保存できます。ただし、シンボルはアレイの長さプロパティに含まれておらず、ほとんどの配列メソッドはそれらを返しません。
シンボルは関数で使用できますか?
はい、関数付きのシンボルを使用できます。たとえば、シンボルを一意の属性キーとして使用して、関数についてメタデータを保存できます。ただし、シンボルは関数の長さプロパティに含まれておらず、ほとんどの関数方法はそれらを返さない。
シンボルはクラスで使用できますか?
はい、クラスでシンボルを使用できます。たとえば、シンボルを一意の属性キーとして使用して、クラスに関するメタデータを保存できます。ただし、シンボルはクラスの長さのプロパティに含まれておらず、ほとんどのクラスメソッドはそれらを返しません。
シンボルは文字列で使用できますか?
はい、文字列付きシンボルを使用できます。たとえば、シンボルを一意の属性キーとして使用して、文字列にメタデータを保存できます。ただし、シンボルは文字列の長さプロパティに含まれておらず、ほとんどの文字列メソッドはそれらを返さない。
以上がES6アクション:シンボルとその用途の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。
