Verificação nula do JavaScript

Encontrei o seguinte código:
function (data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}
Sou um pouco novo no JavaScript, mas, de outras perguntas que tenho lido aqui, tenho a impressão de que este código não faz muito sentido.


Em particular, esta resposta afirma que

obterá um erro se aceder a uma variável indefinida em qualquer outro contexto que não typeof.

actualizar: a (citação da) resposta acima pode ser enganoso. Ele deve dizer "uma variável não declarada" em vez de "uma variável indefinida".

Como eu descobri, nas respostas de Ryan ♦, maerics, e nwellnhof, mesmo quando não há argumentos são fornecidos para uma função, suas variáveis para os argumentos são sempre declaradas. Este fato também prova errado o primeiro item da lista abaixo.


Pelo que sei, os seguintes cenários pode ter experiência:

  • a função foi chamada sem argumentos, tornando assim data uma variável indefinida, e levantando um erro em data != null.

  • a função foi chamada especificamente com null (ou undefined), como seu argumento, nesse caso {[4] } já protege o código interno, tornando && data !== undefined inútil.

  • a função foi chamada com um argumento não nulo, caso em que passará trivialmente ambos data != null e data !== undefined.

p: minha compreensão está correta?


Já tentei o seguinte, na consola do Firefox:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
Não consigo descobrir um caso em que ... data !== undefined depois data != null pode ser útil.

Author: afsantos, 2013-05-21

7 answers

Uma "variável indefinida" é diferente do valor undefined.

Uma variável indefinida:

var a;
alert(b); // ReferenceError: b is not defined

Uma variável com o valor undefined:

var a;
alert(a); // Alerts “undefined”

Quando uma função toma um argumento, esse argumento é sempre declarado, mesmo que o seu valor seja undefined, e assim não haverá nenhum erro. Você está certo sobre != null seguido por !== undefined ser inútil, no entanto.

 101
Author: Ry-, 2013-05-21 14:39:36

Em JavaScript, null é um objecto singleton especial que é útil para sinalizar "sem valor". Você pode testá-lo por comparação e, como de costume em JavaScript, é uma boa prática usar o operador === para evitar confusão tipo coerção:

var a = null;
alert(a === null); // true

Como @rynah menciona, "indefinido" é um pouco confuso em JavaScript. No entanto, é sempre seguro testar se o typeof(x) é a cadeia "indefinida", mesmo que " x " não seja uma variável declarada:

alert(typeof(x) === 'undefined'); // true

Também, as variáveis podem ter o "valor indefinido" se não forem inicializados:

var y;
alert(typeof(y) === 'undefined'); // true
Se juntarmos tudo, o cheque deve ser assim:
if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

No entanto, uma vez que a variável "data" é sempre definida, uma vez que é um parâmetro de função formal, usar o operador "Typ of" É desnecessário e você pode comparar diretamente com o "valor indefinido".

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

Este trecho equivale a dizer " se a função foi chamada com um argumento que é definido e não é nulo..."

 77
Author: maerics, 2013-05-21 15:00:20

Q: a função foi chamada sem argumentos, tornando os dados uma variável indefinida, e levantando um erro nos dados != nulo.

A: SIM, data será definido como indefinido. Ver secção 10.5 Declaração de instanciamento da especificação. Mas aceder a um valor indefinido não cria um erro. Você provavelmente está confundindo isso com acessar uma variável não declarada em modo estrito, o que gera um erro.

P: a função foi chamado especificamente com null (ou indefinido), como seu argumento, em que caso Dados != null já protege o código interno, renderização & dados != = indefinido inútil.

Q: a função foi chamada com um argumento não nulo, caso em que passará trivialmente ambos os dados != null and data !== indefinido.

A: Correcto. Note - se que os seguintes ensaios são equivalentes:

data != null
data != undefined
data !== null && data !== undefined

Ver secção 11.9.3 o algoritmo de comparação abstracta da igualdade e secção 11.9.6 o algoritmo de comparação da igualdade estrita da especificação.

 7
Author: nwellnhof, 2013-05-21 16:20:54

Eu acho que testar variáveis para valores que você não espera não é uma boa idéia em geral. Porque o teste como seu você pode considerar como escrever uma lista negra de valores proibidos. Mas e se te esqueceres de listar todos os valores proibidos? Alguém, até tu, pode decifrar o teu código com um valor inesperado. Então uma abordagem mais apropriada é algo como variáveis de teste de listas brancas apenas para os valores esperados, não inesperados. Por exemplo, se você espera que o valor dos dados seja um string, em vez disto:

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}
Faz algo assim:
function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}
 2
Author: , 2017-12-10 16:59:35

typeof foo === "undefined" é diferente de foo === undefined, nunca os confunda. É o que realmente precisas. Além disso, use !== em substituição de !=

Para que a declaração possa ser escrita como

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

Editar:

Não pode utilizar foo === undefined para variáveis não declaradas.

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}
 1
Author: , 2013-05-21 14:53:02

A forma simples de fazer o teste é:

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}
 0
Author: Kadiri, 2013-05-21 14:59:20
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null
 -2
Author: srivenkatesh, 2014-08-28 10:08:02