Object.freeze()
parece ser um método de conveniência de transição para avançar no uso const
no ES6.
Existem casos em que ambos ocorrem no código ou há uma maneira preferida de trabalhar com dados imutáveis?
Devo usar Object.freeze()
até o momento todos os navegadores com os quais trabalho com suporte const
e mudar para o uso const
?
javascript
ecmascript-6
Sergei Basharov
fonte
fonte
Object.isFrozen
mas eles também são o seu próprio tipo de dados primitivo ...)Respostas:
const
eObject.freeze
são duas coisas completamente diferentes.const
aplica-se a ligações ("variáveis"). Ele cria uma ligação imutável, ou seja, você não pode atribuir um novo valor à ligação.Object.freeze
trabalha com valores e, mais especificamente, valores de objetos . Torna um objeto imutável, ou seja, você não pode alterar suas propriedades.fonte
const
é o novovar
; é apenas de escopo de bloco e impede a reatribuição. Você pode usarlet
, mas realmente só precisa, se quiser alterar o valor que uma variável aponta, o que faz sentido para variáveis de controle / iterador de loop e tipos simples como números e strings, mas não para a maioria dos usos de objetos (incluindo matrizes). Se você deseja um objeto / array cujo conteúdo não possa ser alterado, além de declará-const
lo, também deve chamáObject.freeze()
-lo.const
NÃO é o novovar
,let
é o novovar
No ES5
Object.freeze
, não funciona em primitivas, que provavelmente seriam mais comumente declaradas usando doconst
que objetos. Você pode congelar primitivos no ES6, mas também possui suporte paraconst
.Por outro lado,
const
usado para declarar objetos não os "congela", você não pode redeclarar todo o objeto, mas pode modificar suas chaves livremente. Por outro lado, você pode redeclarar objetos congelados.Object.freeze
também é superficial, então você precisa aplicá-lo recursivamente em objetos aninhados para protegê-los.fonte
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested
: É por causa do escopo do método?Resumo:
const
eObject.freeze()
servir a propósitos totalmente diferentes.const
existe para declarar uma variável que precisa ser atribuída imediatamente e não pode ser reatribuída. variáveis declaradas porconst
têm escopo de bloco e não funcionam como escopo de variáveis declaradas comvar
Object.freeze()
é um método que aceita um objeto e retorna o mesmo objeto. Agora, o objeto não pode ter suas propriedades removidas ou novas propriedades adicionadas.Exemplos
const
:Exemplo 1: Não é possível reatribuir
const
O código a seguir gera um erro porque estamos tentando reatribuir a variável foo que foi declarada com a
const
palavra - chave, não podemos reatribuí-la.Exemplo 2: Estruturas de dados às quais são atribuídos
const
podem ser mutadasNeste exemplo, declaramos uma variável usando a
const
palavra - chave e atribuímos um objeto a ela. Embora não possamos reatribuir a essa variável chamada objeto, podemos alterar o próprio objeto. Se alterarmos as propriedades existentes ou adicionarmos novas, isso terá efeito. Para desativar qualquer alteração no objeto que precisamosObject.freeze()
.Exemplos
Object.freeze()
:Exemplo 1: Não é possível alterar um objeto congelado
Neste exemplo, quando chamamos
Object.freeze()
e apresentamosobject1
como argumento, a função retorna o objeto que está agora 'congelado'. Se compararmos a referência do novo objeto com o objeto antigo usando o===
operador, podemos observar que eles se referem ao mesmo objeto. Além disso, quando tentamos adicionar ou remover propriedades, podemos ver que isso não tem nenhum efeito (gerará erro no modo estrito).Exemplo 2: Objetos com referências não estão totalmente congelados
Este exemplo mostra que as propriedades de objetos aninhados (e outras por estruturas de dados de referência) ainda são mutáveis . Portanto
Object.freeze()
, não 'congela' completamente o objeto quando ele possui propriedades que são referências (por exemplo, Arrays, Objetos).fonte
O exemplo acima torna completamente seu objeto imutável.
Vamos olhar o exemplo a seguir.
Não dará nenhum erro.
Mas se você tentar assim
Irá gerar um erro como "obj é somente leitura".
Outro caso de uso
Vai jogar
Duplicate declaration "obj"
Também de acordo com a explicação const do mozilla docs
Estes exemplos criados de acordo com os recursos do babeljs ES6.
fonte
Sejamos simples.
Eles são diferentes. Verifique os comentários no código, que explicarão cada caso.
Const
- É uma variável de escopo de bloco comolet
, cujo valor não pode ser reatribuído, declarado novamente.Que significa
Todo o entendimento é que const é um escopo de bloco e seu valor não é reatribuído.
Object.freeze
: As propriedades raiz do objeto são imutáveis, também não podemos adicionar e excluir mais propriedades, mas podemos reatribuir o objeto inteiro novamente.// Uma coisa semelhante em ambas é que objetos aninhados são mutáveis
Obrigado.
fonte