Existe uma função JavaScript universal que verifica se uma variável tem um valor e garante que não é undefined
ou não null
? Eu tenho esse código, mas não tenho certeza se ele cobre todos os casos:
function isEmpty(val){
return (val === undefined || val == null || val.length <= 0) ? true : false;
}
(truthy statement) ? true : false;
. Apenas faça(truthy statement);
.if (hungry) …
vez deif (hungry === true) …
. Como todas as coisas de codificação dessa maneira, é apenas uma questão de gosto. Mais específico ao exemplo fornecido pelo OP, ele está dizendo ainda mais detalhadamente: "Se é verdade, então é verdade, se não for então falsa" Mas se for verdade, então já é verdade. E, se for falso, já é falso. Isso é semelhante a dizer "Se você está com fome, então está e, se não, não está".Respostas:
Você pode apenas verificar se a variável tem um
truthy
valor ou não. Que significaavaliará
true
se nãovalue
é :A lista acima representa todos os
falsy
valores possíveis em ECMA- / Javascript. Encontre-o na especificação naToBoolean
seção.Além disso, se você não souber se existe uma variável (ou seja, se foi declarada ), verifique com o
typeof
operador. Por exemploSe você pode ter certeza de que uma variável é declarada pelo menos, verifique diretamente se ela possui um
truthy
valor como o mostrado acima.Leia mais: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html
fonte
if( value || value === false )
. O mesmo vale para todos os valores falsos , precisamos validá-los explicitamente.truthy
poderia ser enganosa. Nesse caso, deveríamos procurarvalue.length != 0
uma matriz não vazia.if
construção é sintaticamente muito pesado, você poderia usar o operador ternário, assim:var result = undefined ? "truthy" : "falsy"
. Ou se você quer apenas para coagir a um valor booleano, use o!!
operador, por exemplo!!1 // true
,!!null // false
.O método detalhado para verificar se o valor é indefinido ou nulo é:
Você também pode usar o
==
operador, mas espera-se que conheça todas as regras :fonte
null
ouundefined
pode ser feito da seguinte forma:if (value == null)
. Cuidado com o==
operador que coagir. Se você marcar assimif (value === null || value === undefined)
, você esqueceu / não sabe como o Javascript coage. webreflection.blogspot.nl/2010/10/…arg == null
produz os mesmos resultados quearg === undefined || arg === null
. No entanto, considero o último exemplo mais legível.arg == null
é bastante comum na minha experiência.return value === (void 0)
é mais seguro do que o teste contra oundefined
qual pode muito bem ser uma variável legítima em escopo, infelizmente.Isso retornará verdadeiro para
e zero funções de argumento, já que uma função
length
é o número de parâmetros declarados necessários.Para não permitir a última categoria, convém verificar se há strings em branco
fonte
undefined == null
masundefined !== null
Esta é a verificação mais segura e eu não a vi postada aqui exatamente assim:
Abrangerá casos em que o valor nunca foi definido e também qualquer um destes:
Editado: alterado para igualdade estrita (! ==) porque já é a norma;)
fonte
typeof
operador retorne uma string, portanto, usar a estrita verificação de igualdade é tecnicamente mais preciso, mais específico e mais rápido. Então, realmente, não há razão para usar a comparação solta, e não o contrário. Tambémval !== null
é perfeitamente válido em muitos casos - eu faço isso o tempo todo. Concordo com o seu argumento de não conformidade, mas acho que este é um mau exemplo para fazê-lo. Não tentando trollar você.Você pode achar útil a seguinte função:
Ou no ES7 (comente se houver mais melhorias)
Resultados:
"Observe que o operador de ligação (: :) não faz parte do ES2016 (ES7) nem de nenhuma edição posterior do padrão ECMAScript. Atualmente, é uma proposta do estágio 0 (strawman) para ser introduzida no idioma." Simon Kjellberg. o autor deseja acrescentar seu apoio a esta bela proposta de receber ascensão real.
fonte
::
) não faz parte do ES2016 (ES7) nem de nenhuma edição posterior do padrão ECMAScript. Atualmente, é uma proposta do estágio 0 (strawman) para ser introduzida no idioma.A primeira resposta com a melhor classificação está errada. Se o valor for indefinido, lançará uma exceção nos navegadores modernos. Você tem que usar:
ou
fonte
undefined
valor.if(value === 0) gameOver();
;)value
é zero, o que não é o que a op está procurando.Esta verificação de condição
é tudo o que você precisa.
fonte
if
já faz uma verificação falsa, que apenas converte em um booleano. Ele pega alguns casos que um normalif(foo)
não pega?active={!!foo}
! verifique se há cadeias vazias (""), nulas, indefinidas, falsas e o número 0 e NaN. Digamos, se uma string estiver vazia,
var name = ""
elaconsole.log(!name)
retornarátrue
.essa função retornará true se val estiver vazio, nulo, indefinido, falso, o número 0 ou NaN .
OU
De acordo com o domínio do seu problema, você pode usar apenas como
!val
ou!!val
.fonte
isEmpty(val)
se você pudesse fazer!val
?!val
ou de!!val
acordo com o domínio do seu problema.Uma solução que eu gosto muito:
Vamos definir que uma variável em branco é
null
, ouundefined
, ou se tem comprimento, é zero, ou se é um objeto, não possui chaves:Devoluções:
undefined
,null
,""
,[]
,{}
true
,false
,1
,0
,-1
,"foo"
,[1, 2, 3]
,{ foo: 1 }
fonte
Você está exagerando um pouco. Para verificar se uma variável não recebe um valor, você só precisa verificar se é indefinido e nulo.
Isso pressupõe que
0
,""
e objetos (mesmo objeto e matriz vazios) são "valores" válidos.fonte
Se você preferir javascript simples, tente o seguinte:
Caso contrário, se você já estiver usando sublinhado ou lodash, tente:
fonte
_.isNil
é a função que você está procurando, não_.isEmpty
. documentação isNil , documentaçãoisArray
ouisString
funciona nowindow
.Aqui está o meu - retorna true se o valor for nulo, indefinido, etc ou em branco (ou seja, contém apenas espaços em branco):
fonte
é uma maneira muito agradável e limpa de lidar com isso em muitos lugares, também pode ser usado para atribuir variáveis
fonte
true
e você está tentando fornecer ou devolver umval
dosfalse
.const res = falsyValue ? true : falsyValue
Se a variável não tiver sido declarada, você não poderá testar indefinidamente usando uma função, pois receberá um erro.
Ambos irão gerar um erro se foo não tiver sido declarado.
Se você quiser testar se uma variável foi declarada, você pode usar
se você quiser testar se foo foi declarado e tem um valor, você pode usar
fonte
Para verificar o valor padrão
verifique o resultado:
Eu usei a função @Vix () para verificar o objeto de qual tipo.
usando instansof «
fonte
// Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
No ES6 com corte para manipular cadeias de espaços em branco:
fonte
Pode ser útil.
Todos os valores na matriz representam o que você deseja ser (nulo, indefinido ou outras coisas) e você pesquisa o que deseja nela.
fonte
Se você estiver usando
TypeScript
e não quiser contabilizar "esses valores sãofalse
" , esta é a solução para você:Primeiro:
import { isNullOrUndefined } from 'util';
Então:
isNullOrUndefined(this.yourVariableName)
Observação: como mencionado abaixo, isso agora está obsoleto, use em seu
value === undefined || value === null
lugar. ref .fonte
/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
typescript
coisa. Você pode fornecer o link da documentação?Vácuo
Não recomendo tentar definir ou usar uma função que calcule se algum valor no mundo inteiro está vazio. O que realmente significa ser "vazio"? Se eu tiver
let human = { name: 'bob', stomach: 'empty' }
, devoisEmpty(human)
voltartrue
? Se eu tiverlet reg = new RegExp('');
, devoisEmpty(reg)
voltartrue
? QueisEmpty([ null, null, null, null ])
tal - esta lista contém apenas o vazio, então a lista em si está vazia? Quero apresentar aqui algumas notas sobre "vacuidade" (uma palavra intencionalmente obscura, para evitar associações pré-existentes) em javascript - e quero argumentar que "vacuidade" em valores de javascript nunca deve ser tratada genericamente.Veracidade / falsidade
Para decidir como determinar a "vacuidade" dos valores, precisamos acomodar o senso inerente e inerente ao javascript de saber se os valores são "verdadeiros" ou "falsos". Naturalmente,
null
eundefined
ambos são "falsos". Menos naturalmente, o número0
(e nenhum outro número, excetoNaN
) também é "falso". Menos naturalmente:''
é falso, mas[]
e{}
(enew Set()
, enew Map()
) são verdadeiros - embora todos pareçam igualmente vazios!Nulo vs Indefinido
Há também alguma discussão sobre
null
vsundefined
- nós realmente precisamos de ambos para expressar a vacuidade em nossos programas? Pessoalmente, evito que as letras u, n, d, e, f, i, n, e, d apareçam no meu código nessa ordem. Eu sempre usonull
para significar "vazio". Novamente, porém, precisamos acomodar o senso inerente de javascript de comonull
eundefined
diferir:undefined
undefined
:undefined
, nãonull
:Vacuidade não genérica
Acredito que a vacuidade nunca deve ser tratada de maneira genérica. Em vez disso, devemos sempre ter o rigor para obter mais informações sobre nossos dados antes de determinar se estão vazios - eu faço isso principalmente verificando com que tipo de dados estou lidando:
Observe que essa função ignora o polimorfismo - espera
value
ser uma instância direta deCls
, e não uma instância de uma subclasse deCls
. eu evitoinstanceof
por duas razões principais:([] instanceof Object) === true
("Uma matriz é um objeto")('' instanceof String) === false
("Uma String não é uma String")Observe que
Object.getPrototypeOf
é usado para evitar um caso comolet v = { constructor: String };
AisType
função ainda retorna corretamente paraisType(v, String)
(false) eisType(v, Object)
(true).No geral, eu recomendo usar esta
isType
função junto com estas dicas:let v = JSON.parse(someRawValue);
, nossav
variável agora é do tipo desconhecido. O mais cedo possível, devemos limitar nossas possibilidades. A melhor maneira de fazer isso pode ser exigindo um tipo específico: por exemploif (!isType(v, Array)) throw new Error('Expected Array');
- essa é uma maneira muito rápida e expressiva de remover a natureza genéricav
e garantir que seja sempre umaArray
. Às vezes, porém, precisamos permitirv
que sejam de vários tipos. Nesses casos, devemos criar blocos de código ondev
não são mais genéricos, o mais cedo possível:if (v === null) throw new Error('Null value rejected');
- isso é ótimo para garantir quenull
valores não passar por isso, mas se um valor faz passar por isso, ainda sabemos pouco nada sobre isso. Um valorv
que passa nessa verificação nula ainda é MUITO genérico - é tudo menosnull
! As listas negras dificilmente dissipam a genérica.A menos que seja um valor
null
, nunca considere "um valor vazio". Em vez disso, considere "um X que é vazio". Essencialmente, nunca considere fazer algo assimif (isEmpty(val)) { /* ... */ }
- não importa como essaisEmpty
função seja implementada (eu não quero saber ...), não é significativo! E é genérico demais! A vacuidade deve ser calculada apenas com o conhecimento doval
tipo. As verificações de vacuidade devem ter a seguinte aparência:if (isType(val, String) && val.length === 0) ...
if (isType(val, Object) && Object.entries(val).length === 0) ...
if (isType(val, Number) && val <= 0) ...
"Uma matriz, sem itens":
if (isType(val, Array) && val.length === 0) ...
A única exceção é quando
null
é usado para significar determinada funcionalidade. Nesse caso, é significativo dizer: "Um valor vazio":if (val === null) ...
fonte
Tente com lógica diferente . Você pode usar o código abaixo para verificar todas as quatro (4) condições para validação, como não nulo, não em branco, não indefinido e não zero, use apenas este código (! (! (Variável))) em javascript e jquery.
fonte
Você pode pensar nesse recurso - o
??
operador - como uma maneira de "retornar" a um valor padrão ao lidar comnull
ouundefined
.Novamente, o código acima é equivalente ao seguinte.
fonte
mas essa solução é projetada em excesso, se você não quiser modificar a função posteriormente para necessidades do modelo de negócios, será mais fácil usá-la diretamente no código:
fonte
Isso nunca gera um erro. Se myObject , child ou myValue for nulo, myNewValue será nulo. Nenhum erro será gerado
fonte
Para todos que vêm aqui por ter perguntas semelhantes, o seguinte funciona muito bem e eu o tenho em minha biblioteca nos últimos anos:
fonte
Se você deseja evitar ser verdadeiro se o valor for qualquer um dos seguintes, de acordo com a resposta de jAndy :
Uma solução possível que pode evitar a obtenção de valores reais é a seguinte:
Seria usado da seguinte maneira:
Além desses cenários, convém retornar false se o objeto ou a matriz estiver vazia:
Você faria dessa maneira:
Se você deseja verificar todas as strings de espaço em branco (""), faça o seguinte:
Nota:
hasOwnProperty
retorna true para cadeias vazias, 0, false, NaN, nula e indefinida, se a variável foi declarada como uma delas, portanto, pode não ser o melhor para usar. A função pode ser modificada para usá-la para mostrar que foi declarada, mas não é utilizável.fonte
Código no GitHub
Testes do pobre homem 😁
Resultado dos testes:
fonte
value.constructor === Object
? Verifique isso .value.constructor === Object
está tudo bem, em javascript, se as instruções OR OR têm ordem de execução, para que a instrução OR seja executada apenas se a anterior não retornar TRUE e já tivermos verificadoNull
. De fato, o único objetivo dessa última instrução OR é detectar{}
e garantir que ela não retorne VERDADEIRO por coisas que não deveria.Isso verificará se a variável de aninhamento indeterminado é indefinida
O item acima verifica se a função de tradução do Google TranslateElement existe. Isso é equivalente a:
fonte
O operador de encadeamento opcional fornece uma maneira de simplificar o acesso a valores por meio de objetos conectados quando é possível que uma referência ou função seja indefinida ou nula.
O operador coalescente nulo pode ser usado após o encadeamento opcional para criar um valor padrão quando nenhum foi encontrado:
fonte
também verificará os espaços em branco ('') junto com o seguinte:
fonte
Eu acho que usando o? operador é um pouco mais limpo.
fonte