Pular para o conteúdo principal

1.1.1 Expressões

Uma maneira fácil de começar a programar é examinar algumas interações típicas com um interpretador da linguagem JavaScript. Você digita uma instrução e o interpretador responde exibindo o resultado da avaliação dessa instrução.

Nesta edição, você pode executar o código JavaScript diretamente na página: cada exemplo aparece em um editor interativo e é avaliado ao pressionar o botão "Executar". O código também é editável — experimente modificá-lo e executar de novo!

Um tipo de instrução que você pode digitar é uma instrução de expressão, que consiste em uma expressão seguida por um ponto e vírgula. Um tipo de expressão primitiva é um número. (Mais precisamente, a expressão que você digita consiste nos numerais que representam o número na base 10.) Se você pedir ao interpretador para avaliar a instrução de expressão

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

ele responderá exibindo o valor resultante. Pressione "Executar" na instrução de expressão primitiva acima e veja o que acontece!

Expressões que representam números podem ser combinadas com operadores (como + ou *) para formar uma expressão composta que representa a aplicação de uma função primitiva correspondente a esses números. Por exemplo, avalie qualquer uma das seguintes instruções de expressão:

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco
Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco
Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco
Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco
Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

Expressões como essas, que contêm outras expressões como componentes, são chamadas de combinações. As combinações formadas por um símbolo de operador no meio e expressões de operando à esquerda e à direita dele são chamadas de combinações de operadores. O valor de uma combinação de operadores é obtido aplicando a função especificada pelo operador aos argumentos que são os valores dos operandos.

A convenção de colocar o operador entre os operandos é conhecida como notação infixa. Ela segue a notação matemática com a qual você provavelmente está familiarizado na escola e na vida cotidiana. Como na matemática, as combinações de operadores podem ser aninhadas, ou seja, podem ter operandos que são combinações de operadores:

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

Como de costume, os parênteses são usados para agrupar combinações de operadores a fim de evitar ambiguidades. JavaScript também segue as convenções usuais quando os parênteses são omitidos: multiplicação e divisão se ligam mais fortemente do que adição e subtração. Por exemplo,

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

significa

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

Dizemos que * e / têm precedência maior que + e -. As sequências de adições e subtrações são lidas da esquerda para a direita, assim como as sequências de multiplicações e divisões. Assim,

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

significa

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

Dizemos que os operadores +, -, * e / são associativos à esquerda.

Não há limite (em princípio) para a profundidade desse aninhamento e para a complexidade geral das expressões que o interpretador JavaScript pode avaliar. Somos nós, humanos, que podemos ficar confusos com expressões ainda relativamente simples, como

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

que o interpretador avaliaria prontamente como sendo 57. Podemos nos ajudar escrevendo tal expressão na forma

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

para separar visualmente os principais componentes da expressão.

Mesmo com expressões complexas, o interpretador sempre opera no mesmo ciclo básico: ele lê uma instrução digitada pelo usuário, avalia a instrução e imprime o resultado. Este modo de operação é frequentemente expresso dizendo que o interpretador é executado em um loop de leitura-avaliação-impressão (também conhecido como REPL). Observe em particular que não é necessário instruir explicitamente o interpretador a imprimir o valor da instrução.1


[1] O JavaScript obedece à convenção de que cada instrução tem um valor (consulte o exercício 4.8). Essa convenção, junto com a reputação dos programadores JavaScript de não se preocuparem com a eficiência, nos leva a parafrasear uma piada sobre os programadores Lisp de Alan Perlis (que estava parafraseando Oscar Wilde): Os programadores JavaScript sabem o valor de tudo, mas o custo de nada.

📝 Encontrou algo errado nesta página?

Sua ajuda é muito importante para melhorar a qualidade da tradução!

🐛 Encontrou um erro?

Se você encontrou:

  • Erro de tradução (palavra incorreta, termo técnico errado)
  • Erro de ortografia ou gramática
  • Link quebrado
  • Código de exemplo que não funciona
  • Problema de formatação

Reporte um bug →

❓ Tem uma dúvida?

Se você tem:

  • Dúvida sobre o conteúdo desta seção
  • Pergunta sobre um conceito do SICP
  • Dificuldade em entender algum exemplo
  • Questão sobre a tradução de algum termo

Inicie uma discussão →

💡 Tem uma sugestão de melhoria?

Se você quer sugerir:

  • Melhoria na explicação
  • Exemplo adicional
  • Recurso visual (diagrama, ilustração)
  • Qualquer outra ideia

Sugira uma melhoria →

🌍 Quer discutir a tradução?

Se você quer debater:

  • Escolha de tradução de algum termo
  • Consistência de terminologia
  • Nuances do português

Discussão de tradução →

Obrigado por ajudar a melhorar o SICP.js PT-BR! ✨