quinta-feira, 3 de março de 2011

Dicas de Programação: Qual a diferença entre NaN, null e undefined no Javascript?

Dica de um amigo! :)

O NaN é um resultado de uma operação ou de uma função que não conseguiu retornar um número real válido. Exemplo:

var a = parseInt("aaaa");
var b = 0/0;

Null é quando o valor de uma variável esta setada como vazia:

var c = null;

O undefined é quando uma variável não tem um valor definido ou uma variável não esta definida:

var d;
alert(typeof(e));

Utilizando o operador de comparação:

a = parseInt("aaaa") ou b = 0/0
a == Number.NaN -> false (????)
a === Number.NaN -> false (????)
a == a -> false (????)
a === a -> false (????)
isNaN(a) -> true
As demais comparações serão false, pois a variável "a" possui um valor.

c = null
c == null -> true
c === null -> true
c == undefined -> true
c === undefined -> false

d = undefined
d == null -> true
d === null -> false
d == undefined -> true
d === undefined -> true

Variável "e" não definido
typeof(e) == "undefined" -> true
typeof(e) === "undefined" -> true
As demais comparações serão false, pois o typeof retorna string.

Os testes foram feitos no Firefox 3.6 (portanto, não sei se os valores retornados em outros navegadores serão os mesmos).

5 comentários:

Unknown disse...

valeu mesmo :) ficou bem claro hehehe

Douglas Matoso disse...

Acho que só em JS uma variável pode ser diferente dela mesma. hehehe...
Por isso que eu gosto dessa linguagem.

Anônimo disse...

Usando o Chrome pra testar as comparações do primeiro quadro com a página do blog carregada eu percebi que as variáveis a, b e c já estão definidas! Talvez por isso que a comparação Number.NaN == a tenha retornado false. Testando com d a comparação não retorna valor mas gera um erro: ReferenceError: d is not defined. typeof(d) retorna o esperado "undefined".

Bruno Sanches disse...

Bem explicado.
As comparações mais engraçadas, na minha opnião são que NaN não é igual a nada, e isso inclue ele mesmo ele mesmo, sendo NaN == NaN => false.
E o mais estranho é que typeof NaN retorna "number". Ambos sendo definições do ECMAScript.

Anônimo disse...

JS = demônio de tasmânia(grade pequena coisa).

Interessante este post.
Lembrei de C# e o comando
var a = null;