Mutable 对象
Dans JavaScript, les objets sont des données de type référence. L'avantage est que lorsque les objets sont fréquemment modifiés, ils sont modifiés en fonction de l'objet d'origine et n'ont pas besoin d'être recréés. Cela peut utiliser efficacement la mémoire et ne provoquera pas de gaspillage d'espace mémoire. Cette caractéristique des objets peut être appelée mutable, ce qui signifie «mutable» en chinois.
Pour les objets mutables, sa flexibilité et son changement peuvent parfois devenir ses inconvénients. Plus les données sont flexibles et modifiables, plus il est difficile de contrôler. Pour un objet avec une structure complexe, les données sont modifiées accidentellement par inadvertance. Si l'objet est utilisé dans plusieurs lunettes, il est difficile de prévoir si et quand les données changent.
var obj = {/ * un objet avec une structure complexe * /}; dosomething (obj); // Une fois la ligne de fonction ci-dessus terminée, OBJ est-il toujours l'OBJ d'origine pour le moment?Pour résoudre ce problème, une solution conventionnelle peut copier un nouvel objet en copiant en profondeur l'objet, puis en le modifiant sur le nouvel objet. Cela peut garantir la contrôlabilité des données, mais la copie fréquente entraînera beaucoup de gaspillage d'espace mémoire.
var obj = { /* 一个复杂结构的对象*/ };// copy 出一个新的obj2// 但是copy 操作会浪费内存空间var obj2 = deepClone(obj);doSomething(obj2);// 上面的函数之行完后,无论obj2 是否变化,obj 肯定还是原来那个objObjet immuable
Afin de mieux résoudre les problèmes ci-dessus, l'objet immuable apparaît et immuable est littéralement traduit en chinois comme "immuable". Chaque fois qu'un objet immuable est modifié, un nouvel objet immuable est créé. L'opération sur le nouvel objet n'affectera pas les données de l'objet d'origine. Cet objet spécial n'est pas la nouvelle caractéristique fonctionnelle de JavaScript, mais un ensemble de solutions fournies par l'industrie pour résoudre ce problème. De bonnes bibliothèques open source ont émergé, dont la plus célèbre est l'open source de Facebook Immutable.js de Lee Byron. Bien sûr, la solution d'immuable n'est pas originale, mais vient de Clojure et Scala.
Comparaison des performances entre mutable et immuable
Le fonctionnement inefficace des objets mutables se reflète principalement dans la réplication et la comparaison, et l'objet immuable résout ces deux points de douleur inefficaces.
L'opération de copie profonde des objets mutables ordinaires copiera toutes les données. L'objet immuable ne copie pas toutes les données lors de la modification des données, mais transférera la relation parent-enfant entre le nœud modifié et le nœud inchangé vers un nouveau nœud, similaire à la structure d'une liste liée. Du point de vue de la «copie», la minimisation de la réplication est atteinte et les pièces inchangées sont partagées. Mutable est "plein" lors de la copie, tandis que l'immuable est "incrémentiel", ce qui détermine le taux d'utilisation élevé ou faible de l'espace mémoire.
Et sur la base de la fonctionnalité que chaque fois qu'un objet immuable est modifié, un nouvel objet immuable sera créé. Cela peut enregistrer l'état modifié des données dans un ensemble de instantanés, ce qui est également assez pratique.
Parlons de l'opération de comparaison. Pour les objets mutables, si vous souhaitez comparer si les deux objets sont égaux, vous devez traverser chaque nœud de l'objet pour comparaison. Pour les objets avec des structures complexes, leur efficacité n'est certainement pas beaucoup plus élevée. Pour les objets immuables, Immutable.js fournit une API qui détermine directement si les "valeurs" de deux objets immuables sont égaux.
var map1 = immuable.map ({a: 1, b: 1, c: 1}); var map2 = immuable.map ({a: 1, b: 1, c: 1}); assert (map1! == Map2); // différentes instances immuables, l'affirmation de l'adresse de référence (Immutable.is (Map1, Map2)); // Les valeurs de MAP1 et MAP2 sont égales et les valeurs affirment (MAP1.Equals (MAP2)); // les fonctions de l'immuable.Dans les applications de développement réelles, la performance n'est pas toujours la plus critique et la plus importante. Pour les projets JavaScript ordinaires, la contrôlabilité des données provoquée par les caractéristiques de l'immuable est plus avantageuse que les performances. Pour les objets mutables, il convient à une utilisation dans une portée fermée, tandis que les objets immuables conviennent à une utilisation lorsque les données doivent être transmises sur plusieurs lunettes.
La différence entre mutable et immuable
Immutable.js fournit une variété de structures de données iMUTABLE: y compris l'enregistrement de la carte de la pile de la liste ordonnance.
Je n'expliquerai pas l'utilisation de chaque structure de données ici, mais je parle principalement de la différence entre l'utilisation d'objets immuables et d'objets mutables.
Les objets mutables natifs sont très pratiques pour «lire» et «écrire».
var mutableobj = {}; // écrire des données mutableobj.foo = 'bar'; // lire des données console.log (mutableobj.foo);L'objet immuable doit «lire» et «écrire» les données via Set et Get.
var immuableObj1 = immuable.map (); // Écriture de données var immuableObj2 = immuableObj1.set ('foo', 'bar'); // read data console.log (ImmutableObj2.get ('foo')); // => 'bar'Afin d'illustrer l'utilisation de la méthode SET, l'exemple ci-dessus a créé un objet vide au début, et en fait, la valeur initiale peut être transmise pendant l'instanciation.
var immuableobj = immuable.map ({'foo', 'bar'});Pour les données avec des niveaux plus profonds, l'interface d'accès fournie par Immutable.js est très pratique.
var immuableObj1 = immuable.fromjs ({a: {b: 'c'}, d: [1, 2, 3]}); // Read Deep Data console.log (immuableObj1.getin (['a', 'b'])); // => 'c'console.log (ImmutableObj1.getIn ([' A ',' B ']); // => 2 // Modifier les données profondes var immuableObj2 = immuableObj1.setin (['a', 'b'], 'd'); console.log (ImmutableObj2.getin (['a', 'b'])); // => 'D'S'il s'agit d'un objet mutable natif, une erreur non définie peut être signalée lors de l'accès à un niveau profond de données dans une chaîne, tandis qu'un objet immuable ne rapportera pas d'erreur lors de la rencontre de cette situation, et le retour n'est pas défini.
Lors du débogage, si vous souhaitez visualiser la structure interne d'un objet immuable, il est recommandé d'utiliser TOJSON () pour le convertir en un objet mutable normal en premier.