Por que subtrair e somar boleanos (true - false) retorna números? #498
Replies: 9 comments
-
Bônus: http://www.jsfuck.com/ |
Beta Was this translation helpful? Give feedback.
-
Uia não sabia que isso acontecia com Javascript eu esperava que retornasse C, por exemplo, não tem built-in booleans, então um Se quiser entender um pouco mais baixo nível, procure no google como funciona a ALU e seus logic gates. |
Beta Was this translation helpful? Give feedback.
-
Assim, JS é muito alto nível pra falar que o motivo disso é ser o funcionamento de baixo nível. |
Beta Was this translation helpful? Give feedback.
-
Posso estar errado, mas acredito que esta resposta se aplica ao caso:
Segundo o autor do livro "Eloquent Javascript", o javascript utiliza um
conjunto de regras para fazer a coerção do tipo. Ele também recomenda usar
os operadores === e !== para evitar a coerção inesperada ao realizar comparações.
"When an operator is applied to the “wrong” type of value, JavaScript will quietly convert that value to the type it wants, using a set of rules that often aren’t what you want or expect. This is called *type coercion*."
http://eloquentjavascript.net/01_values.html#h_AY+YGu6qyM
Segundo o w3schools o método Number() também converte booleano para número. Então a regra deve ser direta: false (0) e true (1).
|
Beta Was this translation helpful? Give feedback.
-
Como o @diogokobbi comentou, acredito que isso ocorra por conta da conversão de tipos (Type Coersion) do JavaScript. Caso você tente realizar operações matemáticas com tipos que não sejam Tendo isso em vista, e sabendo que false - true // (JS Interpreta como: "0 - 1 = -1")
-1
false - false // (JS Interpreta como: "0 - 0 = 0")
0
true - false // (JS Interpreta como: "1 - 0 = 1")
1
true - true // (JS Interpreta como: "1 - 1 = 0")
0 Obs.: Vale lembrar que essa não é uma característica exclusiva das operações matemáticas do JavaScript. Na verdade, por ser uma linguagem de tipagem fraca e com inferência de tipo, o JavaScript acaba aplicando essas "conversões" de tipos sempre que "necessário", seja na hora de declarar variáveis, seja dentro de blocos de controle de fluxo, ou em blocos de iteração (loops). Se você não gosta desse tipo de tratamento e prefere trabalhar com tipagem forte (sem abrir mão da maior parte das funcionalidades e da sintaxe do JavaScript) eu recomendo usar TypeScript ou Flow. |
Beta Was this translation helpful? Give feedback.
-
Isso acontece no PHP também... uma curiosidade interessante @felquis 😃 |
Beta Was this translation helpful? Give feedback.
-
Bônus: 2 + 1 //3
2 + "1" //"21"
2 - 1 //1
2 - "1" //1 |
Beta Was this translation helpful? Give feedback.
-
@munizart Exato! Eu já quebrei muito a cabeça tentando fazer operações matemáticas que no fim acabavam resultando em concatenação de números, ao invés de soma. Uma solução simples pra prevenir esse tipo de coisa é adicionar o operador "2" + 1 // Retorna "21"
+"2" + 1 // Retorna 3
var stringNumber = "100";
+stringNumber + 50 // Retorna 150 |
Beta Was this translation helpful? Give feedback.
-
"adicionar o operador + antes de qualquer tipo que vá ser somado"
Excelente. Obrigado!
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>
Livre
de vírus. www.avast.com
<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail>.
<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Estava eu debugando um problema, e resolvi brincar com
false - true
e pra minha surpresa o resultado foi:A mesma coisa funciona para fazer boleano com números, parece que ele só entende que true é 1 e que false é 0 e resolve como qualquer outra operação com números...
Se alguém puder explicar de forma mais baixo nível o que acontece, eu ficaria grato :D
Att
Beta Was this translation helpful? Give feedback.
All reactions