ES6の微妙さ:コレクション(パート1)

今週の初め(6月19日の記事- )、ESMA仕様(正式にECMA-262、第6版、ECMAScript 2015言語仕様 )は、最後の障壁を克服し、Ecma規格として承認されました。 TC39および支援してくれた他の皆さんにおめでとう。 ES6は終了しました!

さらに良いことには、次の更新を6年間待つ必要がなくなります。 委員会は、約1年後に新しいバージョンをリリースする予定です。 ES7の提案はすでに受け入れられています!

Javascriptで私が見たいと思っていた部分で、まだ改善の余地がある部分について話して、このイベントを祝うことが適切だと思います。



共進化の難しさ



JSは他のプログラミング言語とあまり類似しておらず、これは言語の進化に最も予期せぬ影響を与える場合があります。 良い例は、ES6のモジュールです。 モジュールは他の言語-ラケット(優れた実装)、Pythonです。 委員会がモジュールをES6に追加することに決めたとき、既存の実装をコピーしてみませんか?

JSはブラウザで実行されるため、異なります。 I / O操作にはかなりの時間がかかる場合があります。 したがって、ES6モジュールシステムは非同期ロードをサポートする必要があります。 異なるディレクトリでモジュールを定期的に検索することはできません。 したがって、現在の実装をコピーすることは最良の選択肢ではありません。

最終設計にどのように影響したか-別の時間。 モジュールについては説明しません。 ES6が「キー付きコレクション」と呼ぶもの、 SetMapWeakSetWeakMapについて説明します。 これらの構造は、他の言語のハッシュテーブルに似ています。 しかし、議論の過程で、委員会はJSの特殊性のため、いくつかの妥協を行いました。

コレクションを選ぶ理由


JSに精通している人なら誰でも、ハッシュテーブルのようなもの(オブジェクト)が既にあることを知っています。 普通のObject 、結局のところ、キーと値のペアのコレクションよりも少し大きいです。 プロパティを追加、反復、読み取り、削除できます。すべてハッシュテーブルと同じです。 では、なぜこれらの新機能は言語にあるのですか?

さて、いくつかのプログラムではオブジェクトがそのように使用され、それが機能する場合、 MapまたはSetを使用する特別な理由はありません。 ただし、この方法で通常のオブジェクトを使用すると問題が発生します。


ES6はこのアプローチに問題を追加します-通常のオブジェクトはもはや反復可能ではありません 。つまり、 for-ofループ、演算子...などでは動作しません。

繰り返しますが、多くのプログラムではこれは重要ではなく、通常のオブジェクトを引き続き使用できます。 MapおよびSet -その他の場合。 データとビルトインプロパティ(プロパティ)の衝突を防ぐため、ES6のコレクションはデータをプロパティとして公開しません。 つまり、 obj.keyobj[key]などの式を使用してデータにアクセスすることはできません。 map.get(key)を書かmap.get(key)ばなりmap.get(key) 。 また、(プロパティとは異なり)ハッシュテーブルのエントリは、プロトタイプチェーンを使用して継承されません。
利点は、 MapSetが通常のオブジェクトとは異なり、競合することなく標準とカスタムの両方のメソッドを持つことができることです。

セット


Setは値のセットです。 変更可能であるため、要素を追加および削除できます。 単純な配列のようですね。 しかし、違いがあります。

まず、 Setとは異なり、配列には1つの要素が2回含まれることはありません。 既存の値を追加しようとしても、何も起こりません。
 > var desserts = new Set("abcd"); > desserts.size 4 > desserts.add("a"); Set [ "a", "b", "c", "d" ] > desserts.size 4 

:オリジナルは絵文字を使用しており、コピーするのに問題があります。 とにかく意味は同じです。

上記の例では文字列を使用していますが、 Setは任意のオブジェクトを含めることができます。 また、文字列と同様に、複製を追加しようとしても何も追加されません。

第二に、 Setは、 Set内の要素の存在の確認が非常に高速になるようにデータを保存します。
 > // ,   "zythum" . > arrayOfWords.indexOf("zythum") !== -1 //  true > setOfWords.has("zythum") //  true 

Set内のインデックスは使用できません。
 > arrayOfWords[15000] "anapanapa" > setOfWords[15000] // set    undefined 

利用可能なすべての操作は次のとおりです。

これらの機能のうち、最も強力なのは、データ構造のレベルで機能するnew Set(iterable)です。 これを使用して、配列をSetに変換し、1行のコードで重複を削除できます。 または、そこにジェネレータを渡すと、要素を実行して多くの要素に収集します。 これは、既存のSetをコピーする方法でもあります。

先週、ES6の新しいコレクションについて不平を言うと約束しました。 おそらく始めましょう。 Setがどれほど優れていても、次のバージョンの標準に含めると便利なメソッドがあります。


良いニュースは、ES6が提供するメソッドを使用して、これらすべてを自分で実装できることです。

材料の量のため、私は2つの部分に分けることにしました。 2番目の部分は、マップと弱いコレクションについてです。

Source: https://habr.com/ru/post/J261187/


All Articles