今週の初め(6月19日の記事-
約 )、ESMA仕様(正式に
ECMA-262、第6版、ECMAScript 2015言語仕様 )は、最後の障壁を克服し、Ecma規格として承認されました。 TC39および支援してくれた他の皆さんにおめでとう。 ES6は終了しました!
さらに良いことには、次の更新を6年間待つ必要がなくなります。 委員会は、約1年後に新しいバージョンをリリースする予定です。
ES7の提案はすでに受け入れられています!
Javascriptで私が見たいと思っていた部分で、まだ改善の余地がある部分について話して、このイベントを祝うことが適切だと思います。
共進化の難しさ
JSは他のプログラミング言語とあまり類似しておらず、これは言語の進化に最も予期せぬ影響を与える場合があります。 良い例は、ES6のモジュールです。 モジュールは他の言語-ラケット(優れた実装)、Pythonです。 委員会がモジュールをES6に追加することに決めたとき、既存の実装をコピーしてみませんか?
JSはブラウザで実行されるため、異なります。 I / O操作にはかなりの時間がかかる場合があります。 したがって、ES6モジュールシステムは非同期ロードをサポートする必要があります。 異なるディレクトリでモジュールを定期的に検索することはできません。 したがって、現在の実装をコピーすることは最良の選択肢ではありません。
最終設計にどのように影響したか-別の時間。 モジュールについては説明しません。 ES6が
「キー付きコレクション」と呼ぶもの、
Set 、
Map 、
WeakSet 、
WeakMapについて説明します。 これらの構造は、他の言語のハッシュテーブルに似ています。 しかし、議論の過程で、委員会はJSの特殊性のため、いくつかの妥協を行いました。
コレクションを選ぶ理由
JSに精通している人なら誰でも、ハッシュテーブルのようなもの(オブジェクト)が既にあることを知っています。 普通の
Object
、結局のところ、キーと値のペアのコレクションよりも少し大きいです。 プロパティを追加、反復、読み取り、削除できます。すべてハッシュテーブルと同じです。 では、なぜこれらの新機能は言語にあるのですか?
さて、いくつかのプログラムではオブジェクトがそのように使用され、それが機能する場合、
Map
または
Set
を使用する特別な理由はありません。 ただし、この方法で通常のオブジェクトを使用すると問題が発生します。
- この方法で使用されるオブジェクトには、衝突の危険性がないメソッドを含めることはできません。
- 最初の点のため、プログラムは
{}
代わりにObject.create(null)
使用するか、組み込みメソッド( Object.prototype.toString
)がデータとして解釈されないことに注意してください。 - キーは文字列またはES6の場合は文字のみです。 オブジェクトをキーにすることはできません。
- オブジェクトのプロパティの数を取得する効果的な方法はありません。
ES6はこのアプローチに問題を追加します-通常のオブジェクトは
もはや反復可能ではあり
ません 。つまり、
for-of
ループ、演算子
...
などでは動作しません。
繰り返しますが、多くのプログラムではこれは重要ではなく、通常のオブジェクトを引き続き使用できます。
Map
および
Set
-その他の場合。 データとビルトインプロパティ(プロパティ)の衝突を防ぐため、ES6のコレクションはデータをプロパティとして公開しません。 つまり、
obj.key
や
obj[key]
などの式を使用してデータにアクセスすることはできません。
map.get(key)
を書か
map.get(key)
ばなり
map.get(key)
。 また、(プロパティとは異なり)ハッシュテーブルのエントリは、プロトタイプチェーンを使用して継承されません。
利点は、
Map
と
Set
が通常のオブジェクトとは異なり、競合することなく標準とカスタムの両方のメソッドを持つことができることです。
セット
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
内の要素の存在の確認が非常に高速になるようにデータを保存します。
>
Set
内のインデックスは使用できません。
> arrayOfWords[15000] "anapanapa" > setOfWords[15000]
利用可能なすべての操作は次のとおりです。
これらの機能のうち、最も強力なのは、データ構造のレベルで機能する
new Set(iterable)
です。 これを使用して、配列を
Set
に変換し、1行のコードで重複を削除できます。 または、そこにジェネレータを渡すと、要素を実行して多くの要素に収集します。 これは、既存の
Set
をコピーする方法でもあります。
先週、ES6の新しいコレクションについて不平を言うと約束しました。 おそらく始めましょう。
Set
がどれほど優れていても、次のバージョンの標準に含めると便利なメソッドがあります。
ap(), .filter(), .some()
などの配列内にある機能ヘルパー。- 非変更操作
set1.union(set2)
およびset1.intersection(set2).
set.addAll(iterable), set.removeAll(iterable)
など、一度に多くの値を操作するメソッド
良いニュースは、ES6が提供するメソッドを使用して、これらすべてを自分で実装できることです。
材料の量のため、私は2つの部分に分けることにしました。 2番目の部分は、マップと弱いコレクションについてです。