Table des matières
Les plats clés
Qu'est-ce que les données persistantes?
Qu'est-ce que Mori?
Pourquoi est-il utile?
dans la pratique
Configuration et utilitaires
Structurer les données
dessinant un pixel
peindre une image
Le câblage ensemble
Interactivité
Suivi des cadres
Annuler les changements
démo
Extensions
Les questions fréquemment posées sur les données immuables et le JavaScript fonctionnel avec Mori
Quel est le concept d'immuabilité en JavaScript?
Comment la bibliothèque MORI aide-t-elle à gérer les données immuables en JavaScript?
Quels sont les avantages de l'utilisation de MORI sur des méthodes JavaScript natives pour gérer les données immuables?
Comment l'immuabilité contribue-t-elle aux performances d'une application?
Quelle est la différence entre les structures de données mutables et immuables?
Comment MORI gère la manipulation des données?
Quelles sont les structures de données persistantes dans Mori?
Comment MORI assure-t-il l'intégrité des données?
Quels sont les avantages de la programmation fonctionnelle en JavaScript avec MORI?
Comment puis-je commencer à utiliser MORI dans mes projets JavaScript?
Maison interface Web js tutoriel Données immuables et JavaScript fonctionnel avec Mori

Données immuables et JavaScript fonctionnel avec Mori

Feb 18, 2025 am 08:34 AM

Données immuables et JavaScript fonctionnel avec Mori

Les plats clés

  • MORI exploite les structures de données persistantes de Clojure, offrant aux développeurs JavaScript des options de données immuables qui améliorent la simplicité et la fiabilité du code.
  • L'utilisation de MORI favorise un paradigme de programmation fonctionnelle en JavaScript en appliquant l'immuabilité, ce qui empêche les effets secondaires involontaires et assure la cohérence des données tout au long du cycle de vie de l'application.
  • La bibliothèque facilite une approche différente de la gestion des données, où les fonctions fonctionnent sur des structures de données séparément, contrastant avec les méthodes typiques de JavaScript, permettant ainsi un code plus propre et plus prévisible.
  • La technique de partage structurelle de MORI rend la manipulation des données efficace en réutilisant les structures de données existantes dans la mesure du possible, ce qui peut entraîner des améliorations des performances dans les applications.
  • Grâce à des exemples comme l'éditeur de pixels avec une fonctionnalité d'annulation, MORI démontre des applications pratiques de structures de données immuables, fournissant aux développeurs des outils pour créer des fonctionnalités qui sont à la fois sophistiquées et robustes.

Cet article a été révisé par des pairs par Craig Bilner et Adrian Sandu. Merci à tous les pairs examinateurs de SitePoint pour avoir fait du contenu SitePoint le meilleur possible!

La programmation fonctionnelle et les données immuables sont un objectif actuel pour de nombreux développeurs JavaScript alors qu'ils essaient de trouver des moyens de rendre leur code plus simple et plus facile à raisonner.

Bien que JavaScript ait toujours pris en charge certaines techniques de programmation fonctionnelle, elles ne sont devenues vraiment devenues que ces dernières années et, traditionnellement, il n'y a pas eu de support natif pour les données immuables non plus. JavaScript apprend toujours beaucoup sur les deux et les meilleures idées proviennent des langues qui ont déjà essayé et testé ces techniques.

Dans un autre coin du monde de la programmation, Clojure est un langage de programmation fonctionnel dédié à une véritable simplicité, en particulier en ce qui concerne les structures de données. Mori est une bibliothèque qui nous permet d'utiliser les structures de données persistantes de Clojure directement à partir de JavaScript.

Cet article explorera la justification derrière la conception de ces structures de données et examinera certains modèles pour les utiliser pour améliorer nos applications. Nous pourrions également considérer cela comme le premier tremplin pour les développeurs JavaScript intéressé par la programmation avec Clojure ou Clojurescript.

Qu'est-ce que les données persistantes?

Clojure fait une distinction entre les valeurs persistantes qui ne peuvent pas être modifiées et des valeurs transitoires qui ont des durées de vie temporelles entre les mutations. Les tentatives de modification des structures de données persistantes évitent de muter les données sous-jacentes en renvoyant une nouvelle structure avec les modifications appliquées.

Cela peut aider à voir à quoi ressemblerait cette distinction dans un langage de programmation théorique.

<span>// transient list
</span>a <span>= [1, 2, 3];
</span>b <span>= a.push(4);
</span><span>// a = [1, 2, 3, 4]
</span><span>// b = [1, 2, 3, 4]
</span>
<span>// persistent list
</span>c <span>= #[1, 2, 3]
</span>d <span>= c.push(4);
</span><span>// c = #[1, 2, 3]
</span><span>// d = #[1, 2, 3, 4]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous pouvons voir que la liste transitoire a été mutée lorsque nous avons poussé une valeur dessus. A et B pointent la même valeur mutable. En revanche, appeler Push sur la liste persistante a renvoyé une nouvelle valeur et nous pouvons voir que C et D pointent vers des listes différentes de discrets.

Ces structures de données persistantes ne peuvent pas être mutées, ce qui signifie qu'une fois que nous avons une référence à une valeur, nous avons également une garantie qu'elle ne sera jamais modifiée. Ces garanties nous aident généralement à écrire du code plus sûr et plus simple. Par exemple, une fonction qui prend des structures de données persistantes car les arguments ne peuvent pas les muter et, par conséquent, si la fonction veut communiquer un changement significatif, il doit provenir de la valeur de retour. Cela conduit à l'écriture de fonctions pures référentiellement transparentes, qui sont plus faciles à tester et à optimiser.

Plus simplement, les données immuables nous obligent à écrire plus de code fonctionnel.

Qu'est-ce que Mori?

MORI utilise le compilateur Clojurescript pour compiler les implémentations des structures de données de la bibliothèque standard de Clojure à JavaScript. Le compilateur émet un code optimisé, ce qui signifie que sans considération supplémentaire, il n'est pas facile de communiquer avec Clojure compilé de JavaScript. Mori est la couche de considération supplémentaire.

Tout comme Clojure, les fonctions de Mori sont séparées des structures de données sur lesquelles elles opèrent, ce qui contraste avec les tendances orientées objet de JavaScript. Nous constaterons que cette différence modifie la direction que nous écrivons du code.

<span>// standard library
</span><span>Array(1, 2, 3).map(x => x * 2);
</span><span>// => [2, 4, 6]
</span>
<span>// mori
</span><span>map(x => x * 2, vector(1, 2, 3))
</span><span>// => [2, 4, 6]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

MORI utilise également le partage structurel pour apporter des modifications efficaces aux données en partageant autant de structure d'origine que possible. Cela permet aux structures de données persistantes d'être presque aussi efficaces que celles transitoires régulières. Les implémentations de ces concepts sont couvertes de manière beaucoup plus détaillée dans cette vidéo.

Pourquoi est-il utile?

Pour commencer, imaginons que nous essayons de retrouver un bug dans une base de code JavaScript dont nous avons hérité. Nous lisons le code en essayant de comprendre pourquoi nous nous sommes retrouvés avec la mauvaise valeur pour la communion.

<span>const fellowship = [
</span>  <span>{
</span>    <span>title: 'Mori',
</span>    <span>race: 'Hobbit'
</span>  <span>},
</span>  <span>{
</span>    <span>title: 'Poppin',
</span>    <span>race: 'Hobbit'
</span>  <span>}
</span><span>];
</span>
<span>deletePerson(fellowship, 1);
</span><span>console.log(fellowship);
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Quelle est la valeur de la communion lorsqu'elle est connectée à la console?

Sans exécuter le code, ni lire la définition de DelePerson (), il n'y a aucun moyen de savoir. Ce pourrait être un tableau vide. Il pourrait avoir trois nouvelles propriétés. Nous espérons qu'il s'agit d'un tableau avec le deuxième élément supprimé, mais parce que nous sommes passés dans une structure de données mutable, il n'y a aucune garantie.

Encore pire, la fonction pourrait maintenir une référence et la muter de manière asynchrone à l'avenir. Toutes les références à la communion à partir d'ici vont travailler avec une valeur imprévisible.

Comparez cela à une alternative avec Mori.

<span>// transient list
</span>a <span>= [1, 2, 3];
</span>b <span>= a.push(4);
</span><span>// a = [1, 2, 3, 4]
</span><span>// b = [1, 2, 3, 4]
</span>
<span>// persistent list
</span>c <span>= #[1, 2, 3]
</span>d <span>= c.push(4);
</span><span>// c = #[1, 2, 3]
</span><span>// d = #[1, 2, 3, 4]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

quelle que soit la mise en œuvre de DelePerson (), nous savons que le vecteur d'origine sera enregistré, simplement parce qu'il existe une garantie qu'elle ne peut pas être mutée. Si nous voulons que la fonction soit utile, il doit renvoyer un nouveau vecteur avec l'élément spécifié supprimé.

Comprendre le flux à travers les fonctions qui fonctionnent sur des données immuables est facile, car nous savons que leur seul effet sera de dériver et de renvoyer une valeur immuable distincte.

Données immuables et JavaScript fonctionnel avec Mori

Les fonctions fonctionnant sur des données mutables ne renvoient pas toujours les valeurs, elles peuvent muter leurs entrées et parfois il est laissé au programmeur de reprendre la valeur de l'autre côté.

Données immuables et JavaScript fonctionnel avec Mori

Plus simplement, les données immuables appliquent une culture de prévisibilité.

dans la pratique

Nous allons voir comment nous pouvons utiliser MORI pour construire un éditeur de pixels avec une fonctionnalité d'annulation. Le code suivant est disponible sous forme de codepen que vous pouvez également trouver au pied de l'article.

Données immuables et JavaScript fonctionnel avec Mori

Nous supposerons que vous suivez soit sur Codepen, soit vous travaillez dans un environnement ES2015 avec MORI et le HTML.

<span>// standard library
</span><span>Array(1, 2, 3).map(x => x * 2);
</span><span>// => [2, 4, 6]
</span>
<span>// mori
</span><span>map(x => x * 2, vector(1, 2, 3))
</span><span>// => [2, 4, 6]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Configuration et utilitaires

Commençons par la destruction des fonctions dont nous aurons besoin de l'espace de noms MORI.

<span>const fellowship = [
</span>  <span>{
</span>    <span>title: 'Mori',
</span>    <span>race: 'Hobbit'
</span>  <span>},
</span>  <span>{
</span>    <span>title: 'Poppin',
</span>    <span>race: 'Hobbit'
</span>  <span>}
</span><span>];
</span>
<span>deletePerson(fellowship, 1);
</span><span>console.log(fellowship);
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il s'agit principalement d'une préférence stylistique. Vous pouvez également utiliser l'une des fonctions de MORI en y accédant directement sur l'objet MORI (par exemple mori.list ()).

La première chose que nous allons faire est de configurer une fonction d'assistance pour visualiser nos structures de données persistantes. La représentation interne de Mori n'a pas beaucoup de sens dans une console, nous allons donc utiliser la fonction TOJS () pour les convertir en un format compréhensible.

<span>import <span>{ vector, hashMap }</span> from 'mori';
</span>
<span>const fellowship = vector(
</span>  <span>hashMap(
</span>    <span>"name", "Mori",
</span>    <span>"race", "Hobbit"
</span>  <span>),
</span>  <span>hashMap(
</span>    <span>"name", "Poppin",
</span>    <span>"race", "Hobbit"
</span>  <span>)
</span><span>)
</span>
<span>const newFellowship = deletePerson(fellowship, 1);
</span><span>console.log(fellowship);
</span>
Copier après la connexion
Copier après la connexion

Nous pouvons utiliser cette fonction comme alternative à Console.log () lorsque nous devons inspecter les structures de données de Mori.

Ensuite, nous allons configurer certaines valeurs de configuration et une fonction d'utilité.

<span><span><span><div</span>></span>
</span>  <span><span><span><h3</span>></span>Mori Painter<span><span></h3</span>></span>
</span><span><span><span></div</span>></span>
</span><span><span><span><div</span> id<span>="container"</span>></span>
</span>  <span><span><span><canvas</span> id<span>='canvas'</span>></span><span><span></canvas</span>></span>
</span><span><span><span></div</span>></span>
</span><span><span><span><div</span>></span>
</span>  <span><span><span><button</span> id<span>='undo'</span>></span>↶<span><span></button</span>></span>
</span><span><span><span></div</span>></span>
</span>
Copier après la connexion
Copier après la connexion

J'espère que vous avez remarqué que notre fonction TO2D () renvoie un vecteur. Les vecteurs sont un peu comme les tableaux JavaScript et prennent en charge un accès aléatoire efficace.

Structurer les données

Nous utiliserons notre fonction TO2D () pour créer une séquence de coordonnées qui représentera tous les pixels sur la toile.

<span>const {
</span>  list<span>, vector, peek, pop, conj, map, assoc, zipmap,
</span>  range<span>, repeat, each, count, intoArray, toJs
</span><span>} = mori;
</span>
Copier après la connexion
Copier après la connexion

Nous utilisons la fonction Range () pour générer une séquence de nombres entre 0 et hauteur * Largeur (dans notre cas 100) et nous utilisons MAP () pour le transformer en une liste de coordonnées 2D avec notre TO2D () fonction d'assistance.

Cela pourrait aider à visualiser la structure des coordonnées.

<span>const log = (<span>...args</span>) => {
</span>  <span>console.log(...args.map(toJs))
</span><span>};
</span>
Copier après la connexion
Copier après la connexion

C'est une séquence unidimensionnelle de vecteurs de coordonnées.

à côté de chaque coordonnée, nous voulons également stocker une valeur de couleur.

<span>// transient list
</span>a <span>= [1, 2, 3];
</span>b <span>= a.push(4);
</span><span>// a = [1, 2, 3, 4]
</span><span>// b = [1, 2, 3, 4]
</span>
<span>// persistent list
</span>c <span>= #[1, 2, 3]
</span>d <span>= c.push(4);
</span><span>// c = #[1, 2, 3]
</span><span>// d = #[1, 2, 3, 4]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous utilisons la fonction répétitive () pour créer une séquence infinie de chaînes '#fff'. Nous n'avons pas à nous soucier de ce remplissage de la mémoire et de planter notre navigateur, car les séquences MORI prennent en charge Évaluation paresseuse . Nous ne calculerons les valeurs des éléments de la séquence que lorsque nous les demandons plus tard.

Enfin, nous voulons combiner nos coordonnées avec nos couleurs sous la forme d'une carte de hachage.

<span>// standard library
</span><span>Array(1, 2, 3).map(x => x * 2);
</span><span>// => [2, 4, 6]
</span>
<span>// mori
</span><span>map(x => x * 2, vector(1, 2, 3))
</span><span>// => [2, 4, 6]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous utilisons la fonction zipmap () pour créer une carte de hachage, avec les coords en tant que touches et les couleurs sous forme de valeurs. Encore une fois, cela pourrait aider à visualiser la structure de nos données.

<span>const fellowship = [
</span>  <span>{
</span>    <span>title: 'Mori',
</span>    <span>race: 'Hobbit'
</span>  <span>},
</span>  <span>{
</span>    <span>title: 'Poppin',
</span>    <span>race: 'Hobbit'
</span>  <span>}
</span><span>];
</span>
<span>deletePerson(fellowship, 1);
</span><span>console.log(fellowship);
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Contrairement aux objets de JavaScript, les cartes de hachage de Mori peuvent prendre n'importe quel type de données comme clé.

dessinant un pixel

Pour changer la couleur de Pixel, nous allons associer l'une des coordonnées de notre carte de hachage avec une nouvelle chaîne. Écrivons une fonction pure qui colore un seul pixel.

<span>import <span>{ vector, hashMap }</span> from 'mori';
</span>
<span>const fellowship = vector(
</span>  <span>hashMap(
</span>    <span>"name", "Mori",
</span>    <span>"race", "Hobbit"
</span>  <span>),
</span>  <span>hashMap(
</span>    <span>"name", "Poppin",
</span>    <span>"race", "Hobbit"
</span>  <span>)
</span><span>)
</span>
<span>const newFellowship = deletePerson(fellowship, 1);
</span><span>console.log(fellowship);
</span>
Copier après la connexion
Copier après la connexion

Nous utilisons les coordonnées x et y pour créer un vecteur de coordonnées que nous pouvons utiliser comme clé, puis nous utilisons Assoc () pour associer cette clé à une nouvelle couleur. N'oubliez pas que parce que la structure des données est persistante, la fonction Assoc () renverra une carte de hachage nouvelle , plutôt que de muter l'ancienne.

peindre une image

Maintenant, nous avons tout ce dont nous avons besoin pour dessiner une image simple sur une toile. Créons une fonction qui prend une carte de hachage des coordonnées contre les pixels et les attire sur un renduContext2d.

<span><span><span><div</span>></span>
</span>  <span><span><span><h3</span>></span>Mori Painter<span><span></h3</span>></span>
</span><span><span><span></div</span>></span>
</span><span><span><span><div</span> id<span>="container"</span>></span>
</span>  <span><span><span><canvas</span> id<span>='canvas'</span>></span><span><span></canvas</span>></span>
</span><span><span><span></div</span>></span>
</span><span><span><span><div</span>></span>
</span>  <span><span><span><button</span> id<span>='undo'</span>></span>↶<span><span></button</span>></span>
</span><span><span><span></div</span>></span>
</span>
Copier après la connexion
Copier après la connexion

Prenons une minute pour comprendre ce qui se passe ici.

Nous utilisons chacun () pour itérer sur notre carte de hachage Pixels. Il passe chaque clé et valeur (ensemble en tant que séquence) dans la fonction de rappel comme p. Ensuite, nous utilisons la fonction enRay () pour la convertir en tableaux qui peuvent être détruits, afin que nous puissions choisir les valeurs que nous voulons.

<span>const {
</span>  list<span>, vector, peek, pop, conj, map, assoc, zipmap,
</span>  range<span>, repeat, each, count, intoArray, toJs
</span><span>} = mori;
</span>
Copier après la connexion
Copier après la connexion

Enfin, nous utilisons des méthodes de toile pour dessiner un rectangle coloré sur le contexte lui-même.

<span>const log = (<span>...args</span>) => {
</span>  <span>console.log(...args.map(toJs))
</span><span>};
</span>
Copier après la connexion
Copier après la connexion

Le câblage ensemble

Maintenant, nous devons faire un peu de plomberie juste pour rassembler toutes ces pièces et fonctionner.

<span>// the dimensions of the canvas
</span><span>const [height, width] = [20, 20];
</span>
<span>// the size of each canvas pixel
</span><span>const pixelSize = 10;
</span>
<span>// converts an integer to a 2d coordinate vector
</span><span>const to2D = (i) => vector(
</span>  i <span>% width,
</span>  <span>Math.floor(i / width)
</span><span>);
</span>
Copier après la connexion

Nous allons nous procurer le canevas et l'utiliser pour créer un contexte pour rendre notre image. Nous redimensions également l'IT de manière appropriée pour refléter nos dimensions.

Enfin, nous passerons notre contexte avec nos pixels à dessiner par la méthode de peinture. Avec un peu de chance, votre toile devrait être rendue sous forme de pixels blancs. Pas la révélation la plus excitante, mais nous nous rapprochons.

Interactivité

Nous voulons écouter des événements de clic et les utiliser pour modifier la couleur d'un pixel spécifique avec notre fonction Draw () de plus tôt.

<span>const coords = map(to2D, range(height * width));
</span>
Copier après la connexion

Nous attachons un écouteur de clic à notre canevas et utilisons les coordonnées d'événements pour déterminer quel pixel de dessiner. Nous utilisons ces informations pour créer une nouvelle carte de hachage Pixel avec notre fonction Draw (). Ensuite, nous peignons cela dans notre contexte et écrasons le dernier cadre que nous avons dessiné.

À ce stade, nous pouvons dessiner des pixels noirs dans la toile et chaque trame sera basée sur la précédente, créant une image composite.

Suivi des cadres

Pour mettre en œuvre une annulation, nous voulons stocker chaque révision historique sur la carte de hachage Pixel, afin que nous puissions les récupérer à nouveau à l'avenir.

<span>// transient list
</span>a <span>= [1, 2, 3];
</span>b <span>= a.push(4);
</span><span>// a = [1, 2, 3, 4]
</span><span>// b = [1, 2, 3, 4]
</span>
<span>// persistent list
</span>c <span>= #[1, 2, 3]
</span>d <span>= c.push(4);
</span><span>// c = #[1, 2, 3]
</span><span>// d = #[1, 2, 3, 4]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous utilisons une liste pour stocker les différentes «cadres» que nous avons dessinés. Les listes prennent en charge l'ajout efficace à la tête et o (1) la recherche pour le premier élément, ce qui les rend idéales pour représenter les piles.

Nous devrons modifier notre écouteur Click pour travailler avec notre pile de trame.

<span>// standard library
</span><span>Array(1, 2, 3).map(x => x * 2);
</span><span>// => [2, 4, 6]
</span>
<span>// mori
</span><span>map(x => x * 2, vector(1, 2, 3))
</span><span>// => [2, 4, 6]
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous utilisons la fonction peek () pour obtenir le cadre en haut de la pile. Ensuite, nous l'utilisons pour créer un nouveau cadre avec la fonction Draw (). Enfin, nous utilisons conj () pour conjoin le nouveau cadre sur le haut de la pile de trame.

Bien que nous modifions l'état local (frame = conj (cadres, newFrame)), nous ne mutrions pas de données.

Annuler les changements

Enfin, nous devons implémenter un bouton d'annulation pour faire éclater le cadre supérieur de notre pile.

<span>const fellowship = [
</span>  <span>{
</span>    <span>title: 'Mori',
</span>    <span>race: 'Hobbit'
</span>  <span>},
</span>  <span>{
</span>    <span>title: 'Poppin',
</span>    <span>race: 'Hobbit'
</span>  <span>}
</span><span>];
</span>
<span>deletePerson(fellowship, 1);
</span><span>console.log(fellowship);
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Lorsque le bouton Annuler est cliqué, nous vérifions s'il y a actuellement des cadres à annuler, utilisez la fonction pop () pour remplacer les cadres par une nouvelle liste qui n'inclut plus le cadre supérieur.

Enfin, nous passons le cadre supérieur sur la nouvelle pile à notre fonction peinture () pour refléter les modifications. À ce stade, vous devriez être en mesure de dessiner et d'annuler les modifications de la toile.

démo

Voici ce que nous nous retrouvons:

Voir les pixels de Pen Mori par SitePoint (@SitePoint) sur Codepen.

Extensions

Voici une liste d'idées pour les façons d'améliorer cette application:

  • Ajouter une palette de couleurs, permettant à l'utilisateur de sélectionner une couleur avant de dessiner
  • Utilisez le stockage local pour enregistrer les cadres entre les sessions
  • Faire l'annulation du raccourci du clavier Ctrl Z
  • Permettez à l'utilisateur de dessiner tout en faisant glisser la souris
  • Implémentez Re-Ride en déplaçant un pointeur d'index, plutôt que de supprimer les trames de la pile
  • Lisez la source Clojurescript pour le même programme
Conclusion

Nous avons examiné les vecteurs, les listes, les gammes et les cartes de hachage, mais Mori est également livré avec des ensembles, des ensembles triés et des files d'attente et chacune de ces structures de données est livrée avec un complément de fonctions polymorphes pour travailler avec eux.

Nous avons à peine rayé la surface de ce qui est possible, mais j'espère que vous en aurez suffisamment vu pour valoriser l'importance de l'appariement des données persistantes avec un ensemble puissant de fonctions simples.

Les questions fréquemment posées sur les données immuables et le JavaScript fonctionnel avec Mori

Quel est le concept d'immuabilité en JavaScript?

L'immuabilité en JavaScript se réfère à l'état d'un objet qui ne peut pas être modifié après sa création. Cela signifie qu'une fois qu'une variable se voit attribuer une valeur, elle ne peut pas être modifiée. Ce concept est crucial dans la programmation fonctionnelle car elle aide à éviter les effets secondaires et rend votre code plus prévisible et plus facile à comprendre. Il améliore également les performances de votre application en permettant une récupération efficace des données et une utilisation de la mémoire.

Comment la bibliothèque MORI aide-t-elle à gérer les données immuables en JavaScript?

MORI est une bibliothèque qui fournit un ensemble de Structures de données persistantes en JavaScript. Ces structures de données sont immuables, ce qui signifie qu'elles ne peuvent pas être modifiées une fois qu'elles sont créées. Cela aide à maintenir l'intégrité des données et évite les modifications accidentelles. MORI fournit également un riche ensemble d'utilitaires de programmation fonctionnelle qui facilite la manipulation de ces structures de données.

Quels sont les avantages de l'utilisation de MORI sur des méthodes JavaScript natives pour gérer les données immuables?

Tandis que JavaScript JavaScript Fournit des méthodes pour gérer les données immuables, MORI offre un moyen plus efficace et robuste de le faire. Les structures de données persistantes de Mori sont plus rapides et consomment moins de mémoire que les méthodes JavaScript natives. De plus, MORI fournit une large gamme d'utilisations de programmation fonctionnelle qui ne sont pas disponibles en JavaScript.

Comment l'immuabilité contribue-t-elle aux performances d'une application?

L'immuabilité peut améliorer considérablement les performances d'une application . Étant donné que les objets immuables ne peuvent pas être modifiés une fois créés, ils peuvent être réutilisés en toute sécurité sur plusieurs appels de fonction sans risque d'être modifiés. Cela conduit à une utilisation efficace de la mémoire et à une récupération des données plus rapide, améliorant ainsi les performances globales de l'application.

Quelle est la différence entre les structures de données mutables et immuables?

Les structures de données mutables sont celles qui peuvent être changé après leur création. D'un autre côté, les structures de données immuables ne peuvent pas être modifiées une fois qu'elles sont créées. Toute opération sur une structure de données immuables se traduit par une nouvelle structure de données.

Comment MORI gère la manipulation des données?

MORI fournit un riche ensemble d'utilitaires de programmation fonctionnelle pour manipuler les données. Ces services publics vous permettent d'effectuer diverses opérations comme la carte, la réduction, le filtre, etc., sur les structures de données sans modifier les données d'origine.

Quelles sont les structures de données persistantes dans Mori?

Structures de données persistantes Dans MORI, les structures de données immuables qui préservent la version précédente des données lorsqu'elles sont modifiées. Cela signifie que chaque fois que vous effectuez une opération sur une structure de données persistante, une nouvelle version de la structure de données est créée et l'ancienne version est conservée.

Comment MORI assure-t-il l'intégrité des données?

MORI assure l'intégrité des données en fournissant des structures de données immuables. Étant donné que ces structures de données ne peuvent pas être modifiées une fois créées, le risque de modification accidentelle des données est éliminé. Cela aide à maintenir l'intégrité des données.

Quels sont les avantages de la programmation fonctionnelle en JavaScript avec MORI?

La programmation fonctionnelle avec MORI en JavaScript offre plusieurs avantages. Cela rend votre code plus prévisible et plus facile à comprendre en évitant les effets secondaires. Il améliore également les performances de votre application en permettant une récupération efficace des données et une utilisation de la mémoire.

Comment puis-je commencer à utiliser MORI dans mes projets JavaScript?

Pour commencer à utiliser MORI dans vos projets JavaScript, vous, vous Besoin d'inclure la bibliothèque MORI dans votre projet. Vous pouvez le faire en l'installant via NPM ou en l'incluant directement dans votre fichier HTML. Une fois la bibliothèque incluse, vous pouvez commencer à utiliser les fonctions et les structures de données de Mori dans votre code.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
Nordhold: Système de fusion, expliqué
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1673
14
Tutoriel PHP
1278
29
Tutoriel C#
1257
24
Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisation Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisation Apr 16, 2025 am 12:12 AM

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

Javascript et le web: fonctionnalité de base et cas d'utilisation Javascript et le web: fonctionnalité de base et cas d'utilisation Apr 18, 2025 am 12:19 AM

Les principales utilisations de JavaScript dans le développement Web incluent l'interaction client, la vérification du formulaire et la communication asynchrone. 1) Mise à jour du contenu dynamique et interaction utilisateur via les opérations DOM; 2) La vérification du client est effectuée avant que l'utilisateur ne soumette les données pour améliorer l'expérience utilisateur; 3) La communication de rafraîchissement avec le serveur est réalisée via la technologie AJAX.

JavaScript en action: Exemples et projets du monde réel JavaScript en action: Exemples et projets du monde réel Apr 19, 2025 am 12:13 AM

L'application de JavaScript dans le monde réel comprend un développement frontal et back-end. 1) Afficher les applications frontales en créant une application de liste TODO, impliquant les opérations DOM et le traitement des événements. 2) Construisez RestulAPI via Node.js et Express pour démontrer les applications back-end.

Comprendre le moteur JavaScript: détails de l'implémentation Comprendre le moteur JavaScript: détails de l'implémentation Apr 17, 2025 am 12:05 AM

Comprendre le fonctionnement du moteur JavaScript en interne est important pour les développeurs car il aide à écrire du code plus efficace et à comprendre les goulots d'étranglement des performances et les stratégies d'optimisation. 1) Le flux de travail du moteur comprend trois étapes: analyse, compilation et exécution; 2) Pendant le processus d'exécution, le moteur effectuera une optimisation dynamique, comme le cache en ligne et les classes cachées; 3) Les meilleures pratiques comprennent l'évitement des variables globales, l'optimisation des boucles, l'utilisation de const et de locations et d'éviter une utilisation excessive des fermetures.

Python vs JavaScript: communauté, bibliothèques et ressources Python vs JavaScript: communauté, bibliothèques et ressources Apr 15, 2025 am 12:16 AM

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Python vs JavaScript: environnements et outils de développement Python vs JavaScript: environnements et outils de développement Apr 26, 2025 am 12:09 AM

Les choix de Python et JavaScript dans les environnements de développement sont importants. 1) L'environnement de développement de Python comprend Pycharm, Jupyternotebook et Anaconda, qui conviennent à la science des données et au prototypage rapide. 2) L'environnement de développement de JavaScript comprend Node.js, VScode et WebPack, qui conviennent au développement frontal et back-end. Le choix des bons outils en fonction des besoins du projet peut améliorer l'efficacité du développement et le taux de réussite du projet.

Le rôle de C / C dans les interprètes et compilateurs JavaScript Le rôle de C / C dans les interprètes et compilateurs JavaScript Apr 20, 2025 am 12:01 AM

C et C jouent un rôle essentiel dans le moteur JavaScript, principalement utilisé pour implémenter des interprètes et des compilateurs JIT. 1) C est utilisé pour analyser le code source JavaScript et générer une arborescence de syntaxe abstraite. 2) C est responsable de la génération et de l'exécution de bytecode. 3) C met en œuvre le compilateur JIT, optimise et compile le code de point chaud à l'exécution et améliore considérablement l'efficacité d'exécution de JavaScript.

Python vs JavaScript: cas d'utilisation et applications comparées Python vs JavaScript: cas d'utilisation et applications comparées Apr 21, 2025 am 12:01 AM

Python est plus adapté à la science et à l'automatisation des données, tandis que JavaScript est plus adapté au développement frontal et complet. 1. Python fonctionne bien dans la science des données et l'apprentissage automatique, en utilisant des bibliothèques telles que Numpy et Pandas pour le traitement et la modélisation des données. 2. Python est concis et efficace dans l'automatisation et les scripts. 3. JavaScript est indispensable dans le développement frontal et est utilisé pour créer des pages Web dynamiques et des applications à une seule page. 4. JavaScript joue un rôle dans le développement back-end via Node.js et prend en charge le développement complet de la pile.

See all articles