Estou um pouco confuso sobre JavaScript undefined
e null
valores.
O que if (!testvar)
realmente faz? Ele testa undefined
e null
ou apenas undefined
?
Depois que uma variável é definida, posso limpá-la novamente undefined
(excluindo a variável)?
Posso passar undefined
como parâmetro? Por exemplo:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
javascript
undefined
AJ.
fonte
fonte
Respostas:
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 diferentenull
. 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 comoundefined
. Você pode testar isso com, por exemplo:Com este método, você não pode dizer a diferença entre
dosomething(1)
edosomething(1, undefined)
;arg2
terá o mesmo valor em ambos. Se você precisar dizer a diferença, pode observararguments.length
, mas executar argumentos opcionais como esse geralmente não é muito legível.Quando uma função não tem
return value;
, ela retornaundefined
. 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, é issoundefined
. 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 esseundefined
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:
No entanto, porque você pode atribuir
undefined
como qualquer outro valor: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: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.Um 'truthiness' tais verificações de teste contra
false
,undefined
,null
,0
,NaN
e cadeias vazias. Mas, neste caso, sim, é realmente com oundefined
que está preocupado. OMI, deve ser mais explícito sobre isso e dizerif (testvar!==undefined)
.Você pode certamente atribuir
undefined
a ele, mas isso não excluirá a variável. Somente odelete 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ê bemdelete 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 issovariable= null
.Sim.
fonte
undefined
é um objeto singleton? O que você quer dizer? É um valor primitivo, e não um objeto.typeof foo=='undefined'
; ele tende a ser usado para (4a) detecção global, caso em que eu preferiria ser explícito e dizer'foo' in window
, ou (4b) testar contra oundefined
próprio valor -, caso em que eu preferiria ser legível e dizerfoo===undefined
. Em teoria, o testetypeof
contra'undefined'
poderia ter um caso de uso que outras construções não poderiam fornecer: farejar a existência de variáveis locais. No entanto, na realidade, você quase sempre sabe quais variáveis são declaradas locais.return
retorno de instruçãoundefined
, mas se a função for um construtor (invocado pelonew
operador), ele retornará o novo objeto (o valor dethis
dentro do construtor) apesar de não ter umareturn
instrução.console.log((function (){}()));
retornaundefined
.console.log((new function (){}()));
retorna um objeto.Você não pode (não deveria?) Definir nada como indefinido, pois a variável não seria mais indefinida - você apenas definiu como algo.
Você não pode (não deveria?) Passar
undefined
para uma função. Se você deseja passar um valor vazio, usenull
.A instrução
if(!testvar)
verifica valores booleanos true / false, este em particular testa se étestvar
avaliadofalse
. Por definição,null
eundefined
não deve ser avaliado nem comotrue
oufalse
, mas o JavaScript avalianull
comofalse
e gera um erro se você tentar avaliar uma variável indefinida.Para testar adequadamente
undefined
ounull
, use estes:fonte
==
e!=
).var a= undefined
. Você pode passarfn(undefined)
. Se você deseja encontrar a diferença entre uma propriedade indefinidap
de um objetoo
e uma propriedadep
que foi definida e definida comoundefined
, você deve usar o'p' in o
operador.testvar === undefined
e não o mais complicadotypeof(testvar) === "undefined"
?typeof
teste para variáveis indefinidas: ao contrárionull
,undefined
é simplesmente uma propriedade do objeto global e pode ser redefinida. É necessário apenas um estilo de codificação específico e um sinal de igual ausente eundefined
é alterado silenciosamente: #:if (undefined = someVar) {...}
undefined
uma propriedade imutável do objeto global, para que seja mais seguro do que costumava ser. No entanto, ainda é possível definir uma variável mutável chamadaundefined
dentro de uma função, para que o problema não tenha desaparecido completamente.A diferença básica é isso
undefined
enull
representa conceitos diferentes.Se apenas
null
estivesse disponível, você não seria capaz de determinar senull
foi definido intencionalmente como o valor ou se o valor ainda não foi definido, a menos que você tenha utilizado a captura de erros pesados: por exemploNo entanto, se você definir intencionalmente o valor como
null
, igualdade estrita comundefined
falhas, permitindo diferenciar entrenull
eundefined
valores:Confira a referência aqui, em vez de confiar nas pessoas dizendo desdenhosamente como "Em resumo, indefinido é uma bagunça específica do JavaScript, que confunde todo mundo". Só porque você está confuso, isso não significa que está uma bagunça.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Este comportamento também não é específico para JavaScript e completa o conceito generalizado que um resultado boolean pode ser
true
,false
, desconhecido (null
), nenhum valor (undefined
), ou algo deu errado (error
).http://en.wikipedia.org/wiki/Undefined_value
fonte
null
teria funcionado muito bem.a == null
étrue
porque a coerção do tipo Javascript.A melhor maneira de verificar valores nulos é
e por indefinido
Você pode atribuir uma variável com indefinida.
fonte
!==
, não!=
SIM, você pode, porque indefinido é definido como indefinido.
seu caso:
você também pode criar sua própria variável indefinida:
fonte
Para responder sua primeira pergunta, o operador not (
!
) forçará o que quer que seja fornecido em um valor booleano. Assimnull
,0
,false
,NaN
e""
(string vazia) serão todos parecem falsas.fonte
undefined
não aparecerá comofalse
, lançará um erro 'não está definido'.if (undefined) {/* Do stuff*/}
não dará um erro, poisundefined
existe como uma propriedade do objeto global. O que causará um erro é algo comoif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, como definir uma variável como indefinida na linha de comando:
Defina uma variável como indefinida no
js
terminal da linha de comando javascript que acompanha o Java no Ubuntu 12.10.Se você definir uma variável como indefinida em um javascript:
Coloque isso em myjs.html:
Imprime isto:
AVISO! Ao configurar sua variável como indefinida, você está configurando sua variável para outra variável. Se alguma pessoa sorrateira executar
undefined = 'rm -rf /';
, sempre que você definir sua variável como indefinida, você receberá esse valor.Você pode estar se perguntando como eu posso gerar o valor indefinido de alienígenas no início e ainda executá-lo. É por causa da elevação do javascript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
fonte
Tente o seguinte:
fonte
O for
if (something)
eif (!something)
é comumente usado para verificar se algo está definido ou não. Por exemplo:O identificador é convertido em um valor booleano e, portanto,
undefined
é interpretado comofalse
. É claro que existem outros valores (como 0 e '') que também são interpretados comofalse
, mas o identificador não deve ter um valor razoável ou você está satisfeito em tratá-lo da mesma forma que o indefinido.Javascript tem um
delete
operador que pode ser usado para excluir um membro de um objeto. Dependendo do escopo de uma variável (por exemplo, se é global ou não), você pode excluí-la para torná-la indefinida.Não há nenhuma
undefined
palavra-chave que você possa usar como um literal indefinido. Você pode omitir parâmetros em uma chamada de função para torná-los indefinidos, mas isso só pode ser usado enviando menos parâmetros para a função; você não pode omitir um parâmetro no meio.fonte
Apenas por diversão, aqui está uma maneira bastante segura de atribuir "não atribuído" a uma variável. Para que isso ocorra uma colisão, é necessário que alguém seja adicionado ao protótipo de Objeto com exatamente o mesmo nome que a sequência gerada aleatoriamente. Tenho certeza de que o gerador de cadeias aleatórias poderia ser melhorado, mas acabei de tirar uma desta pergunta: Gere cadeias / caracteres aleatórios em JavaScript
Isso funciona criando um novo objeto e tentando acessar uma propriedade com um nome gerado aleatoriamente, que estamos assumindo que não existirá e, portanto, terá o valor de indefinido.
fonte