Oi colegas, uma dúvida sobre && , ||
porque nesse exemplo, consigo somar usando operador || “OU” e quando tento usar operador && não reconhece a soma?
Na minha lógica, os dois parametros (a , b) não deveria ser Number? então não devia usar &&?
Oi colegas, uma dúvida sobre && , ||
porque nesse exemplo, consigo somar usando operador || “OU” e quando tento usar operador && não reconhece a soma?
Na minha lógica, os dois parametros (a , b) não deveria ser Number? então não devia usar &&?
Olá, @expertgustavoito !
Vamos ver se consigo ajudar com a sua dúvida (às vezes as explicações saem confusas ).
Primeiramente, como você já deve saber, o verificador &&
exige que ambas as condições testadas sejam verdadeiras para que o retorno seja true
. Já no caso do verificador ||
, basta que uma das condições seja verdadeira para o retorno ser true
.
O que acontece, então, é que a soma do seu método funciona usando ||
porque o filtro é “mais fraco”.
Mas o que, de fato, está sendo testado?
Vamos começar pela verificação da direita, que é mais simples. Ali você simplesmente está testando se o argumento recebido é de algum tipo que não seja NaN
. Isso dá certo porque o valor testado — no caso, o número “4” — é do tipo primitivo number
. Logo, não é do tipo NaN
.
A parte da esquerda é que está sendo “o cara chato” da sua testagem. Porque ali você está verificando se o valor recebido — no caso, o número “1” — é um objeto Number
. E isso é falso, porque o valor “1” do tipo primitivo number
.
Veja se os seguintes exemplos ajudam a esclarecer. Considere que temos duas variáveis:
const a = 5 // isto é um número
const b = new Number(5) // isto é uma instância de Number
Nesse exemplo, a variável a
é do tipo number
, enquanto que a variável b
é do tipo object
.
Como sabemos disso? Verificando:
console.log(typeof(a)) // retorna 'number'
console.log(typeof(b)) // retorna 'object'
Com uma nova testagem, podemos notar que a variável b, da forma como declarei, é um objeto instância de Number. Veja só:
console.log(a instanceof Number) // retorna 'false'
console.log(b instanceof Number) // retorna 'true'
Da mesma maneira, podemos confirmar que a
é um number, mas b
não é:
console.log(typeof(a) === "number") // retorna 'true'
console.log(typeof(b) === "number") // retorna 'false'
Ambos retornariam true
se fossem verificados por !isNaN
, como você usou na testagem da direita. Mas isso só significa que ambos não são do tipo NaN, não significa que são ambos do tipo number
ou ambos instâncias de Number
. Vamos ao teste:
console.log(!isNaN(parseInt(a))) // retorna 'true'
console.log(!isNaN(parseInt(b))) // retorna 'true'
Uma proposta de reescrita do seu método:
function sum(a, b) {
return (typeof(a) === "number" && typeof(b) === "number") ? +a + +b : "Desculpe, você não informou os dois números:"
}
Acredito que assim deve funcionar como esperado.
Ficou confuso? Veja se faz sentido.
Eu também ainda estou aprendendo.
@JoaoEduardoGomes , que máximo! consegui entender, obrigado.
Só não entendi porque quando usamos (igualdade estrita === ) precisa fazer uma referencia do tipo “string” em vez apenas, number?
Oi, @expertgustavoito !
Que bom que consegui ajudar .
Essa sua outra dúvida também parece interessante. Vamos lá!
O que acontece é que o operador typeof
nos retorna uma string informando o tipo do dado verificado. Portanto, se você rodar console.log(typeof(5))
, vai perceber que o retorno é uma string number
. Então, quando queremos verificar se um dado é de um tipo específico, precisamos passar o nome desse tipo via string.
Veja a seção The Data Type of typeof no W3 Schools.
No entanto, pelo que verifiquei, number não é uma palavra reservada do JavaScript. Apesar de ser esse o nome do tipo primitivo. Logo, se você usar === number
sem as aspas, o JavaScript vai entender que number
é uma variável não definida; e isso vai retornar um erro.
Você pode verificar na lista de palavras reservadas do JavaScript.