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
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:
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:
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,
significa
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,
significa
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
que o interpretador avaliaria prontamente como sendo 57. Podemos nos ajudar escrevendo tal expressão na forma
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.