Object.freeze()
semble être une méthode de commodité de transition vers l'utilisation const
dans ES6.
Existe-t-il des cas où les deux prennent leur place dans le code ou existe-t-il une manière préférée de travailler avec des données immuables?
Dois-je utiliser Object.freeze()
jusqu'au moment où tous les navigateurs avec lesquels je travaille prend en charge const
puis passer à l'utilisation à la const
place?
javascript
ecmascript-6
Sergueï Basharov
la source
la source
Object.isFrozen
mais ils sont également leur propre type de données primitif ...)Réponses:
const
etObject.freeze
sont deux choses complètement différentes.const
s'applique aux liaisons ("variables"). Il crée une liaison immuable, c'est-à-dire que vous ne pouvez pas attribuer une nouvelle valeur à la liaison.Object.freeze
travaille sur les valeurs , et plus spécifiquement, les valeurs d'objet . Cela rend un objet immuable, c'est-à-dire que vous ne pouvez pas modifier ses propriétés.la source
const
est le nouveauvar
; il est simplement limité et empêche la réaffectation. Vous pouvez l'utiliserlet
, mais vous n'en avez vraiment besoin que si vous voulez changer la valeur vers laquelle pointe une variable, ce qui est logique pour les variables de contrôle / itérateur de boucle et les types simples comme les nombres et les chaînes, mais pas pour la plupart des utilisations d'objets (y compris tableaux). Si vous voulez un objet / tableau dont le contenu ne peut pas être modifié, alors en plus de le déclarer avec,const
vous devez également l'appelerObject.freeze()
.const
n'est PAS le nouveauvar
,let
est le nouveauvar
Dans ES5
Object.freeze
ne fonctionne pas sur les primitives, qui seraient probablement plus communément déclarées en utilisantconst
que les objets. Vous pouvez figer les primitives dans ES6, mais vous avez également la prise en charge deconst
.D'un autre côté,
const
utilisé pour déclarer des objets ne les "gèle" pas, vous ne pouvez simplement pas redéclarer l'objet entier, mais vous pouvez modifier ses clés librement. D'autre part, vous pouvez redéclarer les objets gelés.Object.freeze
est également superficielle, vous devrez donc l'appliquer de manière récursive sur les objets imbriqués pour les protéger.la source
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested
: est-ce à cause de la portée de la méthode?Résumé:
const
etObject.freeze()
servent des objectifs totalement différents.const
est là pour déclarer une variable qui doit être assinged tout de suite et ne peut pas être réaffectée. les variables déclarées parconst
ont une portée de bloc et non une portée de fonction comme les variables déclarées avecvar
Object.freeze()
est une méthode qui accepte un objet et renvoie le même objet. Désormais, l'objet ne peut avoir aucune de ses propriétés supprimées ni aucune nouvelle propriété ajoutée.Exemples
const
:Exemple 1: impossible de réaffecter
const
Le code suivant génère une erreur car nous essayons de réaffecter la variable foo qui a été déclarée avec le
const
mot clé, nous ne pouvons pas la réaffecter.Exemple 2: les structures de données affectées
const
peuvent être mutéesDans cet exemple, nous déclarons une variable à l'aide du
const
mot - clé et lui affectons un objet. Bien que nous ne puissions pas réaffecter à cette variable appelée object, nous pouvons muter l'objet lui-même. Si nous modifions les propriétés existantes ou ajoutons de nouvelles propriétés, cela aura un effet. Pour désactiver toute modification de l'objet dont nous avons besoinObject.freeze()
.Exemples
Object.freeze()
:Exemple 1: impossible de muter un objet figé
Dans cet exemple, lorsque nous appelons
Object.freeze()
et donnonsobject1
comme argument, la fonction renvoie l'objet qui est maintenant «gelé». Si nous comparons la référence du nouvel objet à l'ancien objet à l'aide de l'===
opérateur, nous pouvons observer qu'ils font référence au même objet. De plus, lorsque nous essayons d'ajouter ou de supprimer des propriétés, nous pouvons voir que cela n'a aucun effet (générera une erreur en mode strict).Exemple 2: les objets avec des références ne sont pas entièrement figés
Cet exemple montre que les propriétés des objets imbriqués (et d'autres structures de données de référence) sont toujours modifiables . Donc,
Object.freeze()
ne «fige» pas complètement l'objet quand il a des propriétés qui sont des références (par exemple à des tableaux, des objets).la source
L'exemple ci-dessus rend complètement votre objet immuable.
Regardons l'exemple suivant.
Cela ne donnera aucune erreur.
Mais si tu essaies comme ça
Il lancera une erreur comme celle-ci "obj est en lecture seule".
Un autre cas d'utilisation
Il jettera
Duplicate declaration "obj"
Aussi selon Mozilla Docs Const Explication
Ces exemples créés selon les fonctionnalités de babeljs ES6.
la source
Soyons simples.
Ils sont différents. Vérifiez les commentaires sur le code, cela expliquera chaque cas.
Const
- C'est une variable de portée de bloc commelet
, dont la valeur ne peut pas être réaffectée, re-déclarée.Cela signifie
La compréhension générale est que const est une portée de bloc et sa valeur n'est pas réaffectée.
Object.freeze
: Les propriétés de la racine de l'objet ne sont pas modifiables, nous ne pouvons pas non plus ajouter et supprimer plus de propriétés mais nous pouvons réaffecter à nouveau l'objet entier.// Une chose qui est similaire dans les deux est, les objets imbriqués sont modifiables
Merci.
la source