Null vs. Indefinido
Free youtube vídeo sobre o assunto
JavaScript (e, por extensão, Transcrito) tem dois tipos de fundo : null
e undefined
. Eles são destinados a significar coisas diferentes:
-
algo não foi inicializado:
undefined
. -
algo está atualmente indisponível:
null
.
acto é que terá de lidar com ambos. Curiosamente em JavaScript com ==
null
e undefined
só são iguais entre si:
// Both null and undefined are only `==` to themselves and each other:console.log(null == null); // true (of course)console.log(undefined == undefined); // true (of course)console.log(null == undefined); // true// You don't have to worry about falsy values making through this checkconsole.log(0 == undefined); // falseconsole.log('' == undefined); // falseconsole.log(false == undefined); // false
Recomendo == null
para verificar tanto para o undefined
ou null
. Geralmente não se quer fazer uma distinção entre os dois.
function foo(arg: string | null | undefined) {if (arg != null) {// arg must be a string as `!=` rules out both null and undefined.}}
Você também pode fazer
== undefined
, mas== null
é mais convencional ou curtos.
uma excepção, nível raizundefined
valores que discutiremos a seguir.
a verificar o nível de raiz indefinido
Lembra-te como disse que devias usar == null
? Claro que sim (porque acabei de o dizer). Não o uses para coisas do nível da raiz. No modo estrito, se você usar foo
e foo
é indefinido você obter uma ReferenceError
exceção e toda a pilha de chamadas desenrola.
você deve usar o modo estrito … e, de fato, o compilador TS irá inseri-lo para você se você usar módulos … mais sobre isso mais tarde no livro, para que você não precisa ser explícito sobre isso 🙂
Então, para verificar se uma variável está definida ou não, em nível global, você normalmente usar typeof
:
if (typeof someglobal !== 'undefined') {// someglobal is now safe to useconsole.log(someglobal);}
Limite de uso explícito de indefinido
Devido a Transcrição dá-lhe a oportunidade de documentar suas estruturas separadamente a partir de valores, em vez de coisas como:
function foo(){// if Somethingreturn {a:1,b:2};// elsereturn {a:1,b:undefined};}
você deve usar um tipo de anotação:
function foo():{a:number,b?:number}{// if Somethingreturn {a:1,b:2};// elsereturn {a:1};}
estilo de Nó retornos de chamada
estilo de Nó funções de retorno de chamada (por exemplo, (err,somethingElse)=>{ /* something */ }
) em geral são convocadas com err
definido para null
se não houver um erro. Você geralmente apenas usa uma verificação truthy para isso de qualquer maneira:
fs.readFile('someFile', 'utf8', (err,data) => {if (err) {// do something} else {// no error}});
ao criar a sua própria APIs não há problema em usar null
neste caso, por consistência. Em toda a sinceridade para suas próprias APIs você deve olhar para as promessas, nesse caso você realmente não precisa se preocupar com os valores de erro ausentes (você lidar com eles com .then
vs. .catch
).
não utilize indefinido como meio de denotar a validade
por exemplo, uma função horrível como esta:
function toInt(str: string) {return str ? parseInt(str) : undefined;}
pode ser muito melhor escrita assim:
function toInt(str: string): { valid: boolean, int?: number } {const int = parseInt(str);if (isNaN(int)) {return { valid: false };}else {return { valid: true, int };}}
JSON e serialização
O JSON padrão tem suporte para codificação null
mas não undefined
. Quando JSON-codificação de um objeto com um atributo que é null
, o atributo será incluído com o seu valor nulo, enquanto um atributo com um undefined
valor serão excluídos totalmente.
JSON.stringify({willStay: null, willBeGone: undefined}); // {"willStay":null}
Como resultado, baseada em JSON de dados de suporte null
valores, mas não undefined
valores. Uma vez que os atributos null
estão codificados, pode transmitir a intenção de limpar um atributo definindo o seu valor para null
antes de codificar e transmitir o objecto para uma loja remota.
A definição dos valores dos atributos indefinidos pode poupar nos custos de armazenamento e transmissão, dado que os nomes dos atributos não serão codificados. No entanto, isto pode complicar a semântica dos valores de compensação Versus valores ausentes.
Final thoughts
TypeScript team doesn’T use null
: TypeScript coding guidelines and it has no caused any problems. Douglas Crockford acha que null
é uma má ideia e todos devemos usar undefined
.
no entanto, as bases de código do estilo NodeJS usam null
para argumentos de erro como padrão, pois denotaSomething is currently unavailable
. Eu pessoalmente não me importo de distinguir entre os dois como a maioria dos projetos usam bibliotecas com opiniões diferentes e apenas descartam ambos com == null
.