Para variáveis locais, a verificação com localVar === undefined
funcionará porque eles devem ter sido definidos em algum lugar no escopo local ou não serão considerados locais.
Para variáveis que não são locais e não estão definidas em nenhum lugar, a verificação someVar === undefined
lançará a exceção: Uncaught ReferenceError: j não está definido
Aqui está um código que esclarecerá o que estou dizendo acima. Por favor, preste atenção aos comentários embutidos para maior clareza .
function f (x) {
if (x === undefined) console.log('x is undefined [x === undefined].');
else console.log('x is not undefined [x === undefined.]');
if (typeof(x) === 'undefined') console.log('x is undefined [typeof(x) === \'undefined\'].');
else console.log('x is not undefined [typeof(x) === \'undefined\'].');
// This will throw exception because what the hell is j? It is nowhere to be found.
try
{
if (j === undefined) console.log('j is undefined [j === undefined].');
else console.log('j is not undefined [j === undefined].');
}
catch(e){console.log('Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.');}
// However this will not throw exception
if (typeof j === 'undefined') console.log('j is undefined (typeof(x) === \'undefined\'). We can use this check even though j is nowhere to be found in our source code and it will not throw.');
else console.log('j is not undefined [typeof(x) === \'undefined\'].');
};
Se chamarmos o código acima, assim:
f();
A saída seria esta:
x is undefined [x === undefined].
x is undefined [typeof(x) === 'undefined'].
Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.
Se chamarmos o código acima como este (com qualquer valor realmente):
f(null);
f(1);
A saída será:
x is not undefined [x === undefined].
x is not undefined [typeof(x) === 'undefined'].
Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.
Quando você faz a verificação como esta:, typeof x === 'undefined'
você está essencialmente perguntando isto: Verifique se a variávelx
existe (foi definida) em algum lugar no código-fonte. (mais ou menos). Se você conhece C # ou Java, esse tipo de verificação nunca é feito porque, se não existir, não será compilado.
<== Fiddle Me ==>