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, o clique do mouse nas instruções JavaScript com fundo escuro é programado de forma que seja exibido um interpretador JavaScript, que pode avaliar a instrução e exibir o valor resultante. A propósito, o programa que faz o clique do mouse em uma instrução JavaScript exibir o interpretador é escrito em JavaScript; é chamado de script para o clique do mouse. Esses scripts eram um objetivo central no design original do JavaScript.

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 nosso script para avaliar a instrução da expressão

Exemplo de Código
486;

clicando nela, ele responderá exibindo um interpretador JavaScript com a opção de avaliar a instrução pressionando um botão "Run" (Executar). Clique na instrução da expressão primitiva 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 instrções de expressão clicando nela:

Exemplo de Código
137 + 349;
Exemplo de Código
1000 - 334;
Exemplo de Código
5 * 99;
Exemplo de Código
10 / 4;
Exemplo de Código
2.7 + 10;

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
(3 * 5) + (10 - 6);

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
3 * 5 + 10 / 2;

significa

Exemplo de Código
(3 * 5) + (10 / 2);

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
1 - 5 / 2 * 4 + 3;

significa

Exemplo de Código
(1 - ((5 / 2) * 4)) + 3;

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
3 * 2 * (3 - 5 + 4) + 27 / 6 * 10;

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

Exemplo de Código
3 * 2 * (3 - 5 + 4)
+
27 / 6 * 10;

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.