Estou um pouco confuso sobre Javascript indefinido e nulo.
Não fique confuso null
. Geralmente, faz sentido e se comporta de maneira semelhante aos conceitos de outras linguagens de script dos objetos 'nulo', 'nulo' ou 'Nenhum' fora da banda.
undefined
, por outro lado, é uma peculiaridade estranha do JavaScript. É um objeto singleton que representa valores fora da banda, essencialmente um segundo semelhante, mas diferente null
. Ele aparece:
Quando você chama uma função com menos argumentos que a lista de argumentos nas function
listas de instruções, os argumentos não passados são definidos como undefined
. Você pode testar isso com, por exemplo:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Com este método, você não pode dizer a diferença entre dosomething(1)
e dosomething(1, undefined)
; arg2
terá o mesmo valor em ambos. Se você precisar dizer a diferença, pode observar arguments.length
, mas executar argumentos opcionais como esse geralmente não é muito legível.
Quando uma função não tem return value;
, ela retorna undefined
. Geralmente, não há necessidade de usar esse resultado de retorno.
Quando você declara uma variável tendo uma var a
instrução em um bloco, mas ainda não atribuiu um valor a ela, é isso undefined
. Novamente, você realmente não precisa confiar nisso.
O typeof
operador assustador retorna 'undefined'
quando seu operando é uma variável simples que não existe, em vez de gerar um erro, como normalmente aconteceria se você tentasse fazer referência a ele. (Você também pode fornecer uma variável simples entre parênteses, mas não uma expressão completa que envolva uma variável inexistente.) Também não é muito útil para isso.
Este é o controverso. Quando você acessa uma propriedade de um objeto que não existe, você não recebe imediatamente um erro como em qualquer outro idioma. Em vez disso, você recebe um undefined
objeto. (E então, quando você tentar usar esse undefined
objeto posteriormente no script, ele sairá errado de uma maneira estranha, muito mais difícil de rastrear do que se o JavaScript tivesse lançado um erro imediatamente.
Isso geralmente é usado para verificar a existência de propriedades:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
No entanto, porque você pode atribuir undefined
como qualquer outro valor:
o.prop= undefined;
que não detecta se a propriedade existe de forma confiável. Melhor usar o in
operador, que não estava na versão original do JavaScript do Netscape, mas está disponível em qualquer lugar agora:
if ('prop' in o)
...
Em resumo, undefined
é uma bagunça específica do JavaScript, que confunde todo mundo. Além dos argumentos de função opcionais, onde JS não possui outro mecanismo mais elegante, undefined
deve ser evitado. Nunca deveria ter sido parte da linguagem; null
teria funcionado bem para (2) e (3) e (4) é uma falha de funcionalidade que só existe porque no início o JavaScript não tinha exceções.
o que if (!testvar)
realmente faz? Ele testa indefinido e nulo ou apenas indefinido?
Um 'truthiness' tais verificações de teste contra false
, undefined
, null
, 0
, NaN
e cadeias vazias. Mas, neste caso, sim, é realmente com o undefined
que está preocupado. OMI, deve ser mais explícito sobre isso e dizer if (testvar!==undefined)
.
Depois que uma variável é definida, posso restaurá-la para indefinida (portanto, excluindo a variável).
Você pode certamente atribuir undefined
a ele, mas isso não excluirá a variável. Somente o delete object.property
operador realmente remove as coisas.
delete
é realmente destinado a propriedades, e não a variáveis como tais. Os navegadores permitem que você se dê bem delete variable
, mas não é uma boa ideia e não funcionará no modo estrito do ECMAScript Fifth Edition. Se você deseja liberar uma referência a algo para que possa ser coletado no lixo, seria mais comum dizer isso variable= null
.
posso passar indefinido como parâmetro?
Sim.