Em JavaScript, existem dois valores que basicamente dizem 'Não existo' - undefined
e null
.
Uma propriedade à qual um programador não atribuiu nada será undefined
, mas para que uma propriedade se torne null
, null
deve ser explicitamente atribuída a ela.
Uma vez pensei que havia uma necessidade de null
porque undefined
é um valor primitivo e null
um objeto. Não é, mesmo que typeof null
vá render 'object'
: Na verdade, ambos são valores primitivos - o que significa nem undefined
e nem null
podem ser retornados de uma função de construtor, já que ambos serão convertidos em um objeto vazio (é necessário lançar um erro para proclamar a falha nos construtores).
Ambos também avaliam false
em contextos booleanos. A única diferença real em que consigo pensar é que um avalia para NaN
, o outro para 0
em contextos numéricos.
Então, por que há ambos undefined
e null
se isso apenas confunde os programadores que estão verificando incorretamente null
ao tentar descobrir se uma propriedade foi definida ou não?
O que eu gostaria de saber é se alguém tem um exemplo razoável onde é necessário usar e null
que não pode ser expresso usando undefined
.
Portanto, o consenso geral parece ser que undefined
significa 'não existe tal propriedade', enquanto null
significa 'a propriedade existe, mas não tem valor'.
Eu poderia conviver com isso se as implementações de JavaScript realmente aplicassem esse comportamento - mas undefined
é um valor primitivo perfeitamente válido, portanto, pode ser facilmente atribuído a propriedades existentes para quebrar esse contrato. Portanto, se você quiser ter certeza de que existe uma propriedade, você deve usar a in
operadora ou hasOwnProperty()
mesmo assim. Então, mais uma vez: qual é o uso prático para valores separados para undefined
e null
?
Na verdade, eu uso undefined
quando desejo cancelar a definição de valores de propriedades que não estão mais em uso, mas que não desejo delete
. Devo usar em null
vez disso?
In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.
Não, apenas undefined
diz isso.
undefined
.