Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Operações matemáticas com strings

Boa noite!

Gostaria de saber o que leva a leitura das duas primeiras operações expressas acima a, de fato somar em vez de concatenar os números, diferentemente do último caso, onde há apenas concatenações entre números e string.

Obrigado!

8 respostas

Olá.

Sua dúvida é referente ao item 11, intitulado "Onde está o erro?" ?

Se sim, vamos lá:

<meta charset="UTF-8">
<script>
    var IDADE1 = 10;
    var IDADE2 = "20";
    var IDADE3 = 12;

    document.write("A média das idades é <br>");
    document.write( (IDADE1 + IDADE2 + IDADE3) / 3);
</script>

Quando o navegador lê o conteúdo do segundo document.write(), ele pega o valor da primeira variável IDADE1 como inteiro, uma vez que lá em cima ela está declarada como inteiro, sem aspas no valor: var IDADE1 = 10;. Depois, ele lê o sinal de + e sabe que ele vai ter que tentar somar ou concatenar o que já tem com o que virá a seguir. Então, o navegador lê a variável IDADE2, porém note que essa variável foi declarada com aspas, logo é uma string, não um inteiro: var IDADE2 = "20";. Sabendo que quando há inteiro sendo somado à uma string, o navegador concatena esses valores. Note que, antes de prosseguir, o navegador tem 10 + "20", que concatenado (por conta das aspas) vira "1020". Agora vem a hora de ler a variável IDADE3. Neste ponto, o navegador sabe que tem uma string "1020" por conta da concatenação anterior, então não importa o que virá a seguir, ele tentará concatenar junto. E é isso que ele acaba fazendo, tendo uma string "102012". Por fim, o navegador percebe que tem que dividir uma string por 3. Como a linguagem JavaScript é uma linguagem de bem alto nível (bem próxima da gente), o navegador entende que, na verdade, você quer o resultado de uma divisão, trabalhando com números. Logo, ele divide 102012 (como um inteiro) por 3 e o resultado seria bem diferente do correto: 34004.

Tudo que eu disse, claro, são regras da linguagem JavaScript, não do navegador em si.

Esse exercício é excelente para te ensinar a importância do cuidado ao declarar as variáveis, principalmente em linguagens que não são fortemente tipadas. Nas que são fortemente tipadas, o compilador não deixa você faz uma operação do tipo string dividida por inteiro, forçando você a alterar o tipo, ou forçar um cast (conversão forçada).

Excelente Regis!!! Resposta de nível de moderador do fórum !

Tudo certo Jonathan?

Olá!

Na verdade isso já me era pacificado. Compreendi o modo como o navegador leu o conteúdo e o que ele fez com a string no meio da equação. (O código que gostaria de mostrar não entrou na mensagem. Erro meu :p).

Acontece que fiz alguns testes, pra entender melhor a lógica usada na hora da leitura.

Repare: a primeira equação é calculada sem qualquer concatenação. O mesmo ocorre com a segunda equação. Na terceira, por outro lado, temos o problema causado pela string.

<meta charset="UTF-8">
<script>

    document.write(+ "20" + 12);
    document.write("<br>");
    document.write(10 + (+ "20") + 12);
    document.write("<br>");
    document.write(10 +  "20" + 12);

</script>

O que gostaria de saber é se de fato, como notei, quando a string vem à frente da equação acompanhada do sinal + ou isolada por () na equação também com o sinal +, passa a ser lida como numeral em vez de uma string.

Vlw!

solução!

Oi Guimarães, sua pergunta é muito válida, mas antes de respondê-la quero esclarecer o seguinte.

Este curso é de lógica de programação e focamos a menor quantidade possível de recurso da linguagem utilizada para que o aluno foque na lógica e não na linguagem. Isso porque ele pode querer seguir outras linguagens e a bagagem da lógica ele leva com ele, não da linguagem.

Sua pergunta tange aspectos específicos da linguagem JavaScript. Tentarei dar uma explicação simples para isso, sem entrar muito em detalhes, mas algum terei que entrar.

JavaScript tenta nos ajudar realizando um monte de conversões implícitas, sem a nossa autorização. Isso pode parecer bom, mas pode nos causar problemas a media que você for criando sistemas complexos com essa linguagem (se continuar com JavaScript nos cursos da Alura verá isso).

A boa prática é converter o dado que você deseja lidar com número antes de usuário. Aliás, você aprenderá isso no curso usando parseInt ouparseFloat.

Se você dizer "+ "20"` no console verá que o resultado é um número e não uma string. Isso porque o JavaScript fez uma conversão implícita para você. A mesma coisa acontece se você faz ""100"/3". Você esta dividindo uma string por um número, mas o JavaScript entende e converte 100 para um número para você.

Apesar da instrução document.write(10 + (+ "20") + 12);funcionar, ela não é legível e confunde quem esta lendo.

Sua curiosidade acabou levando a descoberta desse recurso, mas que eu sugiro evitar pelas razões que apontei.

Sucesso e bom estudo!

Olá.

Obrigado, Flavio.

Jonathan, agora entendi. Pois bem, depois da explicação do Flavio, também descobri esse recurso. Gostaria de reforçar o que ele disse sobre foco. Isso é específico do JavaScript e até pode ter em alguma outra linguagem, mas não é conceito de lógica de fato, é particularidade de linguagem. Sem contar que é bem feio esse tipo de uso. O desenvolvedor deve saber quando precisa de número e quando precisa de string, e utilizar as variáveis corretamente. Basicamente, se vai trabalhar com soma, nunca use strings. Só converta pra string na hora de exibir em algum campo de texto, assim você evita esse tipo de problema.

Em linguagens de baixo nível isso que vou dizer geralmente é mais controlado e importante, mas também é importante utilizar o tipo correto de variável para ocupar o mínimo de memória possível. Por exemplo, uma string "1" ocupa mais memória do que um inteiro 1. Isso porque as linguagens alocam mais memória para uma string (que pode ter valor qualquer valor de caractere), do que para um inteiro (que só abrange números inteiros).

Obrigado instrutor Flávio e Bruno.

Foi apenas uma curiosidade sobre a linguagem mesmo. Evitarei trazer assuntos específicos. Obrigado de toda forma pelas explanações.

Abraços!

Jonathan! Não não, você pode trazer assunto específico sim!!!!!!!!!!!!!!. Digo isso porque você não tem como saber se esse ou aquele conteúdo é específico. Na dúvida, pergunte sempre, mesmo!

Não sei se você se identifica com a linguagem JavaScript. Se rolar uma identificação, nos encontramos ainda esse ano nos cursos avançadas da Alura!

Sucesso e bom estudo!

Isso mesmo que o Flavio disse, não deixe de perguntar nada! Essa é a melhor forma de aprender e acaba ensinando outros também que, às vezes por preguiça, vergonha, esquecimento, ou não ter pensado nisso, acabam não perguntando.

[]'s.