Maison >interface Web >js tutoriel >Collections ES6: Utilisation de la carte, set, faiblemap, faiblet
Cet article explore quatre nouvelles collections ES6 et les avantages qu'ils apportent.
La plupart des langages de programmation principaux ont plusieurs types de collections de données. Python a des listes, des tuples et des dictionnaires. Java a des listes, des collections, des cartes et des files d'attente. Ruby a du hachage et des tableaux. Jusqu'à présent, JavaScript n'a que des tableaux. Les objets et les tableaux sont des aides à droite de JavaScript. ES6 introduit quatre nouvelles structures de données qui amélioreront les capacités puissantes et expressives du langage: map, set, faiblet et faiblemap.
hashmap, dictionnaire et hachage sont plusieurs façons dont divers langages de programmation stockent des paires de valeurs clés, et ces structures de données sont optimisées pour une récupération rapide.
Dans ES5, les objets JavaScript (juste n'importe quelle collection de propriétés avec des clés et des valeurs) peuvent simuler des hachages, mais il existe plusieurs inconvénients à l'utilisation d'objets comme hachages.
Les clés de propriété d'objet JavaScript doivent être des chaînes, ce qui limite leur capacité à être une collection de paires de valeurs clés de différents types de données. Bien sûr, vous pouvez lancer d'autres types de données aux chaînes, mais cela ajoute du travail supplémentaire.
Les objets ne sont pas conçus comme des collections, il n'y a donc pas de moyen efficace de déterminer le nombre d'attributs d'un objet. (Par exemple, object. keys est lent). Lorsque vous traversez les propriétés d'un objet, vous obtenez également ses propriétés prototypes. Vous pouvez ajouter des propriétés itératives à tous les objets, mais tous les objets ne sont pas destinés à être utilisés comme collections. Vous pouvez utiliser la méthode FOR… In Loop et HasownProperty (), mais ce n'est qu'une solution de contournement. Lorsque vous traversez les propriétés d'un objet, les propriétés ne sont pas nécessairement récupérées dans l'ordre elles ont été insérées.
Les objets ont des méthodes intégrées telles que le constructeur, le tostring et la valeur de. Si l'un d'eux est ajouté en tant que propriété, cela peut entraîner un conflit. Vous pouvez créer un objet nu (non hérité de object.prototype) en utilisant object.create (null), mais ce n'est toujours qu'une solution de contournement.
ES6 contient de nouveaux types de données de collecte, il n'a donc plus besoin d'utiliser des objets et de supporter leurs inconvénients.
MAP est la première structure / ensemble de données que nous allons vérifier. Une carte est une collection de paires de valeurs clés de tout type. Il est facile de créer de nouvelles cartes, d'ajouter / supprimer des valeurs, de faire une boucle à travers les clés / valeurs et de déterminer efficacement leur taille. Voici les méthodes clés:
<code class="language-javascript">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 </code>
Exécutez cet exemple sur jsbin
SET est une liste ordonnée de valeurs, sans doublons. L'ensemble n'est pas indexé comme un tableau, mais accessible à l'aide de clés. Le jeu existe déjà dans Java, Ruby, Python et de nombreuses autres langues. Une différence entre les ensembles ES6 et les ensembles dans d'autres langues est que l'ordre est important dans ES6 (pas dans de nombreuses autres langues). Voici les méthodes d'ensemble de clés:
<code class="language-javascript">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 </code>
Exécutez cet exemple sur jsbin
La collection JavaScript Garbage est une forme de gestion de la mémoire dans laquelle les objets qui ne sont plus référencés seront automatiquement supprimés et leurs ressources seront recyclées.
La carte et la définition des références aux objets sont obligés d'être tenus et la collecte des ordures n'est pas autorisée. Cela peut devenir coûteux si MAP / SET fait référence à de grands objets qui ne sont plus nécessaires (tels que les éléments DOM qui ont été supprimés du DOM).
Pour résoudre ce problème, ES6 a également introduit deux nouveaux ensembles faibles appelés faibles et faiblets. Ces collections ES6 sont "faibles" car elles permettent des objets qui n'ont plus besoin d'être effacés de la mémoire.
FaibleMap est la troisième nouvelle collection ES6 que nous avons introduite. FaibleMap est similaire à une carte normale, mais a moins de méthodes et il existe les différences ci-dessus dans la collecte des ordures.
<code class="language-javascript">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); // 删除键 </code>
FaibleMap a plusieurs cas d'utilisation populaires. Ils peuvent être utilisés pour garder les données privées des objets privés ou pour suivre les nœuds / objets DOM.
L'exemple suivant vient de l'expert JavaScript Nicholas C. Zakas:
<code class="language-javascript">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; }()); </code>
L'utilisation de faiblemap ici simplifie le processus de maintien des données d'objet privées. Les objets de personne peuvent être référencés, mais PriatedAdAweakmap n'est pas autorisé à accéder en cas d'instance de personne spécifique.
Le projet Google Polymer utilise FaibleMap dans un extrait de code appelé positionwalker.
PositionWalker suit l'emplacement dans le sous-arbre Dom comme nœud actuel et le décalage dans ce nœud.
FaibleMap est utilisé pour suivre l'édition, la suppression et les changements des nœuds DOM:
<code class="language-javascript">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 </code>
FaibleSet est un ensemble d'ensembles dont les éléments peuvent être collectés à la poubelle lorsque les objets dont ils font référence n'ont plus besoin. LowerSet ne permet pas l'itération. Leurs cas d'utilisation sont assez limités (du moins pour le moment). La plupart des premiers adoptants ont déclaré que la faiblesse peut être utilisée pour marquer des objets sans les modifier. ES6-Feures.org a un exemple d'ajout et de suppression des éléments de faibleSet pour garder une trace de la question de savoir si l'objet a été tagué:
<code class="language-javascript">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 </code>
La carte et le jeu sont une belle nouvelle collection ES6 de paires de valeurs clés. Autrement dit, les objets JavaScript peuvent toujours être utilisés comme collections dans de nombreux cas. Il n'est pas nécessaire de passer à la nouvelle collection ES6 à moins que la situation ne l'exige.
MDN a une bonne liste de questions pour déterminer quand utiliser un objet ou une collection à clé:
Les collections JavaScript étaient auparavant très limitées, mais cela a été corrigé avec ES6. Ces nouvelles collections ES6 amélioreront la puissance et la flexibilité du langage et simplifieront les tâches des développeurs JavaScript qui les adoptent.
Cet article fait partie d'une série de développement Web de Microsoft Technology Evangelist and Developinelligence sur l'apprentissage pratique JavaScript, les projets open source et les meilleures pratiques d'interopérabilité, y compris le navigateur Microsoft Edge et le nouveau moteur de rendu Edgehtml. DevelopIntelligence propose des cours de formation et de formation en JavaScript via A SPENDTO, son blog et son site Web de cours axés sur la fin.
Nous vous encourageons à tester une variété de navigateurs et d'appareils, y compris Microsoft Edge, le navigateur par défaut pour Windows 10, et vous pouvez utiliser les outils gratuits sur Dev.microsoftedge.com, y compris le suivi du problème Edgehtml où vous pouvez Signaler ou rechercher des problèmes Edgehtml, tels que le rendu du site Web ou les problèmes de conformité standard. Visitez également le blog Edge pour les dernières informations des développeurs et des experts de Microsoft.
Dans JavaScript ES6, MAP et faiblemap sont utilisés pour stocker les paires de valeurs clés. Cependant, il existe des différences significatives entre eux. Tout d'abord, dans MAP, la clé peut être de n'importe quel type, tandis que dans faiblemap, la clé doit être un objet. Deuxièmement, MAP a une propriété de taille qui vous permet de vérifier le nombre de paires de valeurs clés, mais FaibleMap n'a pas cette propriété. Enfin, MAP contient de fortes références aux objets clés, ce qui signifie que tant que la carte existe, elles ne sont pas éligibles à la collecte des ordures. LowerMap, en revanche, contient des références faibles à des objets clés, ce qui signifie que s'il n'y a pas d'autres références à l'objet, il peut être collecté par ordures.
Contrairement à la carte et au set, FaibleMap et Waiwset n'ont aucun moyen d'itérer sur leurs éléments. En effet, ils sont conçus pour contenir des références faibles à leurs clés (faiblesmap) ou valeurs (faiblet), ce qui signifie que ceux-ci peuvent être collectés à tout moment. Par conséquent, il n'y a aucune garantie que l'élément existera toujours lorsqu'il essaie de l'itréter dessus. Si vous avez besoin d'itérer la collection, vous devez utiliser la carte ou définir à la place.
Non, vous ne pouvez pas utiliser le type de données d'origine comme clé dans faiblemap ou faibleset. Les clés de ces collections doivent être des objets. En effet, la boutique faible et la faiblesse détiennent des références faibles à leurs clés, ce qui signifie que s'il n'y a pas d'autres références à eux, les clés peuvent être collectées à la poubelle. Les types de données primitifs (tels que les nombres et les chaînes) ne sont pas des ordures collectées comme des objets, ils ne peuvent donc pas être utilisés comme clés dans ces collections.
faiblemap et faiblet ont des caractéristiques uniques, et dans certains cas, ils peuvent être plus appropriés que la carte ou le réglage. Parce qu'ils ont des références faibles à leurs clés (faiblemap) ou à leurs valeurs (faiblet), ils peuvent être collectés à des ordures lorsqu'ils ne sont plus utilisés. Ceci est utile si vous souhaitez associer d'autres données à un objet, mais que vous ne souhaitez pas empêcher l'objet de la collecte des ordures lorsqu'il n'est plus nécessaire. En outre, comme le faiblemap et le faibleSet n'ont pas de moyen d'itérer sur leurs éléments, ils peuvent fournir un certain niveau de confidentialité pour les données qu'ils stockent.
Lorsque les clés de faiblemap ou de faibleSet sont collectées, les entrées correspondantes de la collection seront automatiquement supprimées. En effet, ces ensembles contiennent des références faibles à leurs clés, ce qui signifie que lorsqu'ils ne sont plus utilisés, les clés peuvent être collectées aux ordures. Cette fonctionnalité est utile pour gérer la mémoire dans les applications JavaScript car elle garantit que les données associées aux objets qui ne sont plus utilisées seront également effacées.
Oui, les maphes faibles et les faibles sont idéaux pour stocker des données temporaires. Parce qu'ils ont des références faibles à leurs clés (faiblemap) ou à leurs valeurs (faiblet), ils peuvent être collectés à des ordures lorsqu'ils ne sont plus utilisés. Cela signifie que lorsque les clés sont collectées à la poubelle, les données stockées dans ces ensembles sont également effacées. Ceci est utile pour stocker ce qui n'est nécessaire que pendant une courte période, car vous n'avez pas à vous soucier de le nettoyer manuellement.
Vous pouvez utiliser la méthode HAS pour vérifier si le faiblemap ou la faiblesse contient une certaine clé. Cette méthode renvoie une valeur booléenne indiquant si la clé existe dans la collection. Cependant, n'oubliez pas que vous ne pouvez pas utiliser cette méthode pour vérifier une certaine valeur en faibleSet, car les valeurs de cet ensemble sont inaccessibles.
Oui, vous pouvez utiliser la méthode de suppression pour supprimer l'entrée de FaibleMap. Cette méthode supprime l'entrée associée à la clé donnée et renvoie une valeur booléenne indiquant si la clé existe dans la collection. Cependant, vous ne pouvez pas supprimer les entrées de FaibleSet car cette collection n'a pas de méthode de suppression.
Non, vous ne pouvez pas effacer toutes les entrées dans FaibleMap ou LowerSet. Ces collections n'ont pas de méthode claire, qui est disponible en carte et en jeu. En effet, les maphes et les faibles sont conçus pour nettoyer automatiquement les clés lorsqu'ils sont collectés à la poubelle.
Non, vous ne pouvez pas obtenir la taille du faiblemap ou de la faiblesse. Ces collections ne disposent pas d'une propriété de taille, qui est disponible en carte et en jeu. En effet, la taille du faiblemap ou de la faiblesse peut être modifiée à tout moment en raison de la collecte des ordures.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!