Executando verificação de segurança...
3

Undefined x Null | Qual a difereça e uso da memória

Olá pessoal. Eu estou vendo em JS esses tipos de dados, se puderem tirar as dúvidas abaixo eu agradeço!

O que é o tipo null?
E o tipo undefined?

Qual os casos de usos de cada um?

Qual ocupa um espaço na memória? Ou ambos ocupam?

Carregando publicação patrocinada...
2

Esses valores são usados para representar a ausência de um valor ou a falta de definição.

  • Undefined:
    Uma variável é considerada "undefined" quando foi declarada, mas não foi atribuído nenhum valor a ela.
let x;
console.log(x); // undefined
  • Null:
    É usado para explicitamente atribuir a uma variável a ausência de valor. Isso significa quevocê está definindo a variável como vazia ou sem referência a qualquer objeto. Diferentemente do "undefined", que é atribuído automaticamente, o "null" é usado quando você deseja indicar que a variável deve ser vazia de forma intencional.

Uso de Memória

"undefined" e "null" têm comportamentos semelhantes, eles ocupam espaço na memória para armazenar as informações sobre a variável e seu estado. Essa alocação de memória é geralmente muito pequena e não costuma ser uma preocupação no consumo de memória.

2

Não dá para definir claramente qual é o consumo de memória delas por uma razão muito básica. A especificação de EcmaScript (o nome correto de JavaScript) não diz nada como isso deve ser e cada implementação pode fazer com achar melhor, desde que não viole outros aspectos da especificação, inclusive sobre o que esses estados são.

Sabe-se que ocupa algum espaço e provavelmente não é pouco já que a linguagem tem tipagem dinâmica e isso exige uma infraestrutura mais complexa para cumprir esse objetivo. Há uma chance razoável de consumir o mesmo espaço e pode ser o mesmo de outros tipos simples (não inclui string, e array (obviamente object também).

Não se sabe, até olhar a implementação, se há um estado básico de qualquer valor já pode identificar se está indefinido ou nilo ou precisa de um objeto alocado para identificar isso. Eu não usaria o último se eu fosse um implementador. Mas o objeto de memória que identifica o tipo e um valor inicial não tem como escapar. Eu, como implementador, adotaria um padrão que em cima disso, sem precisar de um objeto auxiliar.

Talvez queira saber sobre o uso do Garbage Collector quando usa um ou outro. E ambos são considerados valores que não seguram valores úteis e portanto se algum objeto tinha uma variável o referenciando, quando o valor passa ser tanto null quanto undefined, a referência é perdida e o objeto é coletado em momento propício.

Então para efeitos de memória considere que ambos são iguais no que mais importa. Se precisar muito de um uso mais controlado, o que é bem raro em JS, você terá que testar em cada implementação para ver o comportamento e fazer da melhor forma para resolver o problema. E terá que monitorar porque em cada versão poderá mudar o comportamento.

Para entender mais veja essa pergunta que tem respostas que eu assino embaixo (as com mais pontuação). Mas o resumo é que o primeiro indica quew a variável não tem um valor definido, como o nome sugere, e o segundo tem um valor em estado considerado inválido, mas há um valor definido. A semântica de cada um é diferente e o segundo pode ter uma semântica até mesmo contextual, já que não tem uma definição universal do que é um valor inválido, só se sabe que é um valor e é considerado inválido.

Faz sentido para você?

Espero ter ajudado.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1

Quanto à memória ocupada por null e undefined, é seguro dizer que não mais do que alguns bytes, e esse valor também varia de acordo com o ambiente de execução, mas no geral é bem pouco, irrelevante. Eu não consegui encontrar onde eu li essa informação, já faz um tempo, mas lembro que era uma análise completa da linguagem utilizando ferramentas de profiling de memória.

1

Minha explicação provavelmente vai ser um pouco fajuta pois sou um iniciante que ainda esta aprendendo os fundamentos, mas se eu estiver errado por favor me corrijam. Não sei qual é a diferença em relação ao uso da memória mas aqui vai os conceitos de null e undefined:

É importante comentar que os dois tipos representam a ausência de valor.

Undefined: É um valor que não foi declarado. É praticamente como se você declarasse uma variável e não atribuisse nenhum valor a ela. Mas nesse caso, o undefined fala explicitamente que não tem valor.

Null: É um valor que representa o vazio. Quando colocado em uma variável é praticamente dizer que está guardando um valor "vazio". É interessante comentar que o null em operação aritméticas pode ser visto como 0, então se você fizer:
console.log(null ** 0) //vai dar 1

1

Null e Undefined não sao tipos de dados. Correspondem a representações de valores. Cada linguagem lida com isso de alguma forma.

No js Null e Undefined foram denominados e "implementados" como tipos da linguagem para que seja possível realizar a coerção entre tipos de forma natural (https://developer.mozilla.org/en-US/docs/Glossary/Type_coercion) as operações de comparação não estrita (o ==) é uma mágica polemica no js, amada por poucos e odiada por muitos... Essa é uma discussão ampla e envolve aspectos profundos...

Outro ponto importante sobre o undefined é que foi feito como uma "arte manha" da linguagem para que seu código errado (com o tempo vc perceberá) não gere um erro em execução! Na época inicial da linguagem foi interessante pois era o que chamavam de (parâmetro opcional), e acesso seguro a varáveis sem valores. Hj em dia usar undefined para representar alguns conceitos é um crime!

O typescript está sendo e será o futuro do js, tipagem correta e 'forte' oferece segurança em tempo de edição/compilação.

Programei anos em js puro e a pior coisa são erros escondidos por comparações erradas e falta de checagem de tipos antes de usar um dado.

A dica é:

  1. Nunca use undefined. mas sempre teste qud necessário. Ele existe para representar um "endereço de mémoria" inacessível. Ou seja, a linguagem em muitas situações, ao invés de dá um erro de "acesso" ela vai lhe retornar undefined. Ex: argumento de função que não foi preenchido, ou acesso a uma propriedade inexistente via indíce (objeto["xxx"]), ou variável declarada sem valor atribuído;
  2. O null deve ser utilizado para representar uma referência "vazia". Ou seja a "área de memória" existe mas está vazia sem valor "semântico" definido o valor presente é o "null";
  3. Para garantir que o garbage colector trabalhe corretamente e limpe a memória evite referências cíclicas;

Realmente é complicado entender de primeira a real desses "tipos", com o tempo vc vai sentindo na pele o armengue geral do js... Neste caso mesmo o null é uma keyword da linguagem e o undefined é uma prioridade global (uma variável global)...