Eu trabalhei com o jQuery ao longo dos anos. No entanto, recentemente, eu me encontrei aprofundando a linguagem JavaScript. Recentemente, ouvi falar de valores "verdade" e falsey. No entanto, eu não os entendo completamente. Atualmente, eu tenho um código que se parece com isso:
var fields = options.fields || ['id', 'query'];
Preciso identificar se os campos são nulos, indefinidos ou têm um comprimento igual a 0. Sei o longo caminho a fazer:
if ((fields === null) || (fields === undefined) || (fields.length === 0)) {
...
}
Minha pergunta é: é o mesmo:
if (!fields) {
...
}
javascript
user687554
fonte
fonte
Respostas:
Na programação, veracidade ou falsidade é a qualidade daquelas expressões booleanas que não resolvem um valor booleano real, mas que, no entanto, são interpretadas como um resultado booleano.
No caso de C, qualquer expressão avaliada como zero é interpretada como falsa. Em Javascript, a expressão
value
emserá avaliado como true se
value
não for:Consulte também
Existe uma função padrão para verificar variáveis nulas, indefinidas ou em branco no JavaScript?
fonte
O conjunto de valores "truthy" e "falsey" no JavaScript vem da
ToBoolean
operação abstrata definida na especificação ECMAScript , que é usada ao coagir um valor a um booleano:Nesta tabela, podemos ver isso
null
eundefined
ambos são coagidosfalse
em um contexto booleano. No entanto, o seufields.length === 0
geralmente não é mapeado para um valor falso. Sefields.length
for uma sequência, ela será tratada comofalse
(porque é uma sequência de comprimento zerofalse
), mas se for um objeto (incluindo uma matriz) será coagidatrue
.Se
fields
deve ser uma sequência,!fields
é um predicado suficiente. Sefields
for uma matriz, sua melhor verificação pode ser:fonte
Resposta curta:
Não , eles não são os mesmos.
Mas isso:
if (!fields) { ... }
É o mesmo que isto:
if ((fields === null) || (fields === undefined) || (fields === 0) || (fields === '') || (fields === NaN) || (fields === flase)) { ...
}
Resposta longa (e melhor):
Vamos primeiro falar sobre valores de verdade e falsidade.
É tudo sobre o que acontece quando você avalia algo como um booleano. Em JavaScript, isso acontece quando você usa coisas como
if
instruções; operadores lógicos gosta||
,!
ou&&
; ou aBoolean()
função.A
Boolean()
função aceita um valor e retornatrue
oufalse
.Por exemplo:
var age = 1; // Let's evaluate age as a boolean Boolean(age); // true
Vá em frente e tente isso em uma substituição de nó.
Um booleano pode ser apenas
true
orfalse
, portanto o valor de retorno deBoolean()
deve sertrue
oufalse
. Nesse caso, passamos o valor1
e, quando avaliado como booleano,1
étrue
.Importante: Quando avaliado como um booleano, um valor deve ser verdadeiro ou falso. Essas são as duas únicas opções.
Em JavaScript, existem apenas 6 valores de falsidade. Valores que serão
false
quando avaliados como booleanos. Eles são:false
,0
,""
,null
,undefined
, eNaN
. Portanto, se algum desses valores for avaliado como booleano, eles serão falsos:Boolean(false) // false Boolean(0) // false Boolean("") // false Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false
Isso significa que qualquer outro valor, em JavaScript, será
true
quando avaliado como um booleano. Portanto, todos os outros valores no JavaScript são verdadeiros.Outra maneira fácil de avaliar algo como
boolean
está usando o!
operador. Assim como aBoolean
função, isso avalia um valor como booleano. Mas valoresfalse
verdadeiros se tornam e valores falsificados se tornamtrue
.!false // true !0 // true !"" / true !null // true !undefined // true !NaN // true
Novamente, tente isso em uma substituição de nó ou algo assim para garantir que você entenda.
Portanto, esta declaração:
if (!fields) { ... }
Está dizendo o seguinte: "se
fields
, quando avaliado como booleano, for falso, execute o código dentro desta instrução if".Quanto à sua primeira declaração:
var fields = options.fields || ['id', 'query'];
Você está trabalhando com o operador OR lógico, que vale a pena ler, para garantir que você entenda. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators
fonte
Seu código significa:
Agora
options.fields
é convertido em um valor booleano. Por definiçãonull
,undefined
,0
,""
é convertido emfalse
, (a maioria) que qualquer outra coisa é convertido emtrue
(mas eu não quero ser tão preciso).Não significa o mesmo, porque a
fields.length === 0
linha. Matrizes vazias e outros objetos são convertidos emtrue
.Nota: Javascript às vezes é uma grande bagunça ... Por exemplo, não há necessidade real de dois operadores de verificação de tipo (typeof e instanceof). Ele apenas confunde as pessoas quando
true instanceof Boolean
não funciona e o usotypeof(true) == "boolean"
é propenso a erros por causa da digitação de uma string sem preenchimento automático. Talvez em algumas novas versões esses problemas sejam resolvidos.fonte
Você pode tentar (!! fields) se o elemento fields for nulo, indefinido ou tiver um comprimento de 0, ele retornará true. Ou (!!! campos), isso retornaria verdadeiro.
o dobro ! ou !! forçará verdadeiro ou falso. Eu gostaria de encontrar uma boa definição para isso, mas não consigo encontrá-la novamente.
fonte