ほとんどの主要なプログラミング言語には、いくつかのタイプのデータ収集があります。 Pythonには、リスト、タプル、辞書があります。 Javaには、リスト、コレクション、マップ、キューがあります。 Rubyにはハッシュと配列があります。これまでのところ、JavaScriptには配列のみがあります。オブジェクトと配列は、JavaScriptの右側のヘルパーです。 ES6は、言語の強力で表現力豊かな機能を強化する4つの新しいデータ構造を導入します:マップ、セット、弱点、弱いマップ。
キーポイント
Disadvantage#1:ES5のキーは文字列
でなければなりませんjavaScriptオブジェクトプロパティキーは文字列でなければなりません。これにより、異なるデータ型のキー価値ペアのコレクションになる能力が制限されます。もちろん、文字列に他のデータ型をキャストできますが、これにより追加の作業が追加されます。
オブジェクトはコレクションとして設計されていないため、オブジェクトの属性の数を判断する効果的な方法はありません。 (たとえば、Object.Keysは遅い)。オブジェクトのプロパティをループすると、プロトタイププロパティも取得できます。すべてのオブジェクトに反復可能なプロパティを追加できますが、すべてのオブジェクトがコレクションとして使用されることを意図しているわけではありません。 for…in loop and hasownProperty()メソッドを使用できますが、これは単なる回避策です。オブジェクトのプロパティをループすると、挿入された順序でプロパティが必ずしも取得されるわけではありません。
オブジェクトには、コンストラクター、トストリング、Valueofなどの組み込みメソッドがあります。それらのいずれかがプロパティとして追加されると、競合する可能性があります。 object.create(null)を使用して、裸のオブジェクト(object.prototypeから継承されていない)を作成できますが、これはまだ回避策です。
ES6には新しいコレクションデータ型が含まれているため、オブジェクトを使用して欠点に耐える必要はなくなりました。
ES6マップコレクションを使用してマップを作成し、一般的な方法を使用します
const map = new Map(); // 创建一个新的Map map.set('hobby', 'cycling'); // 设置键值对 const foods = { dinner: 'Curry', lunch: 'Sandwich', breakfast: 'Eggs' }; // 新对象 const normalfoods = {}; // 新对象 map.set(normalfoods, foods); // 设置两个对象作为键值对 for (const [key, value] of map) { console.log(`${key} = ${value}`); // hobby = cycling [object Object] = [object Object] } map.forEach((value, key) => { console.log(`${key} = ${value}`); }, map); // hobby = cycling [object Object] = [object Object] map.clear(); // 清除键值对 console.log(map.size === 0); // True
set
を使用していますこの例をJSBIN
で実行しますconst planetsOrderFromSun = new Set(); planetsOrderFromSun.add('Mercury'); planetsOrderFromSun.add('Venus').add('Earth').add('Mars'); // 可链式方法 console.log(planetsOrderFromSun.has('Earth')); // True planetsOrderFromSun.delete('Mars'); console.log(planetsOrderFromSun.has('Mars')); // False for (const x of planetsOrderFromSun) { console.log(x); // 输入和输出顺序相同 - Mercury Venus Earth } console.log(planetsOrderFromSun.size); // 3 planetsOrderFromSun.add('Venus'); // 尝试添加重复项 console.log(planetsOrderFromSun.size); // 仍然是3,没有添加重复项 planetsOrderFromSun.clear(); console.log(planetsOrderFromSun.size); // 0
javascriptガーバージコレクションは、もはや参照されていないオブジェクトが自動的に削除され、リソースがリサイクルされるメモリ管理の形式です。
この問題を解決するために、ES6はWeakMapとWeaksetと呼ばれる2つの新しい弱いセットも導入しました。これらのES6コレクションは、メモリからクリアされる必要がなくなったオブジェクトを許可するため、「弱い」です。
weakmap
weakmapは、紹介した3番目の新しいES6コレクションです。 WeakMapは通常のマップに似ていますが、方法が少なく、ガベージコレクションには上記の違いがあります。
weakmapにはいくつかの一般的なユースケースがあります。オブジェクトのプライベートデータをプライベートに保つため、またはDOMノード/オブジェクトを追跡するために使用できます。
const aboutAuthor = new WeakMap(); // 创建新的WeakMap const currentAge = {}; // 键必须是对象 const currentCity = {}; // 键必须是对象 aboutAuthor.set(currentAge, 30); // 设置键值 aboutAuthor.set(currentCity, 'Denver'); // 键值可以是不同数据类型 console.log(aboutAuthor.has(currentCity)); // 测试WeakMap是否包含键 aboutAuthor.delete(currentAge); // 删除键
次の例は、JavaScriptの専門家Nicholas C. Zakasからのものです:<
dom node use case
var Person = (function() { var privateData = new WeakMap(); function Person(name) { privateData.set(this, { name: name }); } Person.prototype.getName = function() { return privateData.get(this).name; }; return Person; }());
weakMapは、domノードの編集、削除、および変更の追跡に使用されます。
const map = new Map(); // 创建一个新的Map map.set('hobby', 'cycling'); // 设置键值对 const foods = { dinner: 'Curry', lunch: 'Sandwich', breakfast: 'Eggs' }; // 新对象 const normalfoods = {}; // 新对象 map.set(normalfoods, foods); // 设置两个对象作为键值对 for (const [key, value] of map) { console.log(`${key} = ${value}`); // hobby = cycling [object Object] = [object Object] } map.forEach((value, key) => { console.log(`${key} = ${value}`); }, map); // hobby = cycling [object Object] = [object Object] map.clear(); // 清除键值对 console.log(map.size === 0); // True
weaksetは、参照するオブジェクトが不要になったときに、要素をガベージに収集できるセットのセットです。 weadsetは反復を許可しません。彼らのユースケースは非常に限られています(少なくとも当面は)。ほとんどの初期の採用者は、Weaksetを使用してオブジェクトを変更せずにタグ付けできると述べました。 es6-features.orgには、オブジェクトがタグ付けされているかどうかを追跡するために、弱点から要素を追加および削除する例があります。
const planetsOrderFromSun = new Set(); planetsOrderFromSun.add('Mercury'); planetsOrderFromSun.add('Venus').add('Earth').add('Mars'); // 可链式方法 console.log(planetsOrderFromSun.has('Earth')); // True planetsOrderFromSun.delete('Mars'); console.log(planetsOrderFromSun.has('Mars')); // False for (const x of planetsOrderFromSun) { console.log(x); // 输入和输出顺序相同 - Mercury Venus Earth } console.log(planetsOrderFromSun.size); // 3 planetsOrderFromSun.add('Venus'); // 尝试添加重复项 console.log(planetsOrderFromSun.size); // 仍然是3,没有添加重复项 planetsOrderFromSun.clear(); console.log(planetsOrderFromSun.size); // 0
MDNには、オブジェクトまたはキー付きコレクションをいつ使用するかを決定するための質問の良いリストがあります。
キーは通常、実行されるまで不明ですか?動的に見つける必要がありますか?
Windows 10用のデフォルトのブラウザであるMicrosoft Edgeを含むさまざまなブラウザーやデバイスでテストすることをお勧めします。Dev.microsoftedge.comで無料ツールを使用できます。 Webサイトのレンダリングや標準的なコンプライアンスの問題など、EdgeHTMLの問題を報告または検索します。また、Microsoftの開発者と専門家からの最新情報については、The Edgeブログをご覧ください。
ES6コレクション(FAQ)に関するFAQ:マップ、セット、weakMap、weakset
JavaScriptES6のMAPとWeakMapの主な違いは何ですか?Map and Setとは異なり、WeakMapとWeaksetには要素を反復する方法はありません。これは、キー(弱いマップ)または値(弱点)への弱い参照を保持するように設計されているためです。つまり、これらはいつでもゴミを収集することができます。したがって、要素を繰り返しようとするときに要素がまだ存在するという保証はありません。コレクションを繰り返す必要がある場合は、代わりにマップを使用するか、設定する必要があります。
いいえ、元のデータ型をWeakMapまたはWeakSetのキーとして使用することはできません。これらのコレクションのキーはオブジェクトでなければなりません。これは、WeakMapとWeaksetがキーへの弱い参照を保持しているためです。つまり、それらへの他の参照がなければ、キーを収集することができます。プリミティブデータ型(数字や文字列など)はオブジェクトのように収集されたごみではないため、これらのコレクションのキーとして使用することはできません。
weakmapとweaksetにはいくつかのユニークな機能があり、場合によっては、マップまたは設定よりも適切である場合があります。彼らはキー(弱いマップ)または値(弱点)への弱い参照を保持しているため、使用していないときにゴミを収集することができます。これは、他のデータをオブジェクトに関連付けたいが、オブジェクトが不要になったときにガベージコレクションを防ぎたくない場合に役立ちます。さらに、WeakMapとWeaksetには要素を反復する方法がないため、保存するデータに一定レベルのプライバシーを提供できます。
WeakMapまたはWeakSetのキーがゴミ収集されると、コレクション内の対応するエントリが自動的に削除されます。これは、これらのセットがキーへの弱い参照を保持しているためです。つまり、使用していない場合、キーはガベージを収集できることを意味します。この機能は、JavaScriptアプリケーションのメモリの管理に役立ちます。これは、使用されていないオブジェクトに関連付けられたデータもクリアされることを保証するためです。
はい、WeakMapとWeakSetは一時的なデータを保存するのに最適です。彼らはキー(弱いマップ)または値(弱点)への弱い参照を保持しているため、使用していないときにゴミを収集することができます。これは、キーが収集されたガベージである場合、これらのセットに保存されているデータもクリアされることを意味します。これは、手動で掃除することを心配する必要がないため、短時間だけ必要なものを保存するのに役立ちます。
HASメソッドを使用して、WeakMapまたはWeakSetに特定のキーが含まれているかどうかを確認できます。この方法は、キーがコレクションに存在するかどうかを示すブール値を返します。ただし、このセットの値がアクセスできないため、この方法を弱体セットで特定の値をチェックすることはできないことを忘れないでください。
はい、deleteメソッドを使用して、weakmapからエントリを削除できます。このメソッドは、指定されたキーに関連付けられたエントリを削除し、コレクションにキーが存在するかどうかを示すブール値を返します。ただし、このコレクションには削除メソッドがないため、weaksetからエントリを削除することはできません。
いいえ、WeakMapまたはWeakSetのすべてのエントリをクリアすることはできません。これらのコレクションには、マップとセットで使用できる明確な方法がありません。これは、WeakMapとWeaksetが、ゴミ収集されたときにキーを自動的にクリーンアップするように設計されているためです。
いいえ、WeakMapまたはWeakSetのサイズを取得することはできません。これらのコレクションには、地図とセットで使用できるサイズプロパティがありません。これは、ゴミ収集のために、WeakMapまたはWeaksetのサイズをいつでも変更できるためです。
以上がES6コレクション:MAP、SET、WEALDMAP、WEAKSETを使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。