さらに良いことには、次の更新を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
内の要素の存在の確認が非常に高速になるようにデータを保存します。
> // , "zythum" . > arrayOfWords.indexOf("zythum") !== -1 // true > setOfWords.has("zythum") // true
Set
内のインデックスは使用できません。
> arrayOfWords[15000] "anapanapa" > setOfWords[15000] // set undefined
利用可能なすべての操作は次のとおりです。
-
new Set
は、新しい空のnew Set
作成します。 -
new Set(iterable)
はセットを作成し、 反復可能なsourceからのデータを入力します 。 -
set.size
は、セット内の要素の数を返します。 -
set.has(value)
は、セットに指定された値が含まれている場合にtrueを返します。 -
set.add(value)
は、セットに要素を追加します。 既存のものを追加しようとしても、何も起こりません。 -
set.delete(value)
は、セットから要素を削除します。 add()と同様に、セットへの参照を返します。これにより、メソッドを次々に呼び出すことができます(a Fluid Interface- およそ )。 -
set[Symbol.iterator]()
は、セット内の値の新しい反復子を返します。 通常は直接呼び出されませんが、これがセットを反復可能にする理由です。 したがって、for (v of set) {...}
などのように書くことができます。 -
set.forEach(f)
、コードで説明するのset.forEach(f)
最も簡単です。 これは、次の式の要約です。
for (let value of set) f(value, value, set);
これは、配列内の.forEach()
に類似しています。
-
set.clear()
すべての要素を削除します。 -
set.keys(), set.values(), set.entries()
さまざまなイテレータを返します。 これらはMapとの互換性を目的としているため、後で詳しく説明します。
これらの機能のうち、最も強力なのは、データ構造のレベルで機能する
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番目の部分は、マップと弱いコレクションについてです。