Introduo
continuam por a, basta saber onde procur-las. Uma linguagem
especfica chamada JavaScript est presente em praticamente todos
Esse livro sobre como fazer com que os computadores faam
os navegadores e, por isso, est disponvel em quase todos os
exatamente o que voc quer que eles faam. Hoje em dia, os
aparelhos.
computadores so to comuns quanto as chaves de fenda, mas
Esse livro tem o objetivo de familiariz-lo o suficiente com essa
possuem uma complexidade escondida que os torna mais difceis de
linguagem para que voc seja capaz de fazer com que o computador
se operar e entender. Para muitos, eles continuam sendo no muito
faa o que voc quiser.
familiares e ameaadores.
Sobre Programao
Eu no esclareo aqueles que no tm vontade de aprender, nem
desperto aqueles que no esto ansiosos para dar uma explicao a
si mesmos. Se eu mostrei um lado de um quadrado e eles no
conseguem chegar nos outros trs, eu no deveria passar pelos
mesmos pontos novamente.
Ns encontramos duas maneiras efetivas para aproximar o espao
vazio que existe na comunicao entre ns, organismos biolgicos
com um talento para o raciocnio espacial e social, e os
computadores, que no possuem sentimentos e so apenas
manipuladores de dados. A primeira delas, baseada em usar nosso
senso do mundo fsico e construir interfaces que simulam esse
mundo, permitindo manipular estruturas na tela com os nossos
dedos. Isso funciona muito bem para interaes casuais com a
mquina.
Entretanto, ainda no encontramos uma maneira boa de usar a
abordagem de apontar e clicar para comunicar ao computador as
coisas que o designer da interface no previu. Para interfaces mais
gerais, como instruir o computador a executar tarefas arbitrrias,
tivemos mais sorte com uma abordagem que utiliza nosso talento
Confcio
Antes de explicar o JavaScript, irei introduzir tambm os princpios
bsicos de programao. Programao de fato difcil. As regras
fundamentais
so
geralmente simples
e claras.
Entretanto,
programas construdos em cima dessas regras tendem a se tornar
complexos, introduzindo suas prprias regras e complexidades
adicionais. De certa forma, voc estar construindo o seu prprio
labirinto e, talvez, possa acabar se perdendo nele.
Haver momentos de frustrao quando estiver lendo esse livro e, se
voc novo em programao, haver uma grande quantidade de
material para ser digerido. Durante a leitura, muitos desses conceitos
sero combinados de vrias formas, forando-o a fazer novas
conexes.
para linguagem: ensinar uma linguagem mquina.
Fica a seu critrio saber qual o nvel de esforo necessrio. Quando
As linguagens humanas possibilitam que palavras e frases sejam
combinadas de diferentes maneiras, nos permitindo falar diferentes
coisas. As linguagens de computador, normalmente menos flexveis
em sua gramtica, seguem um princpio similar.
O uso da computao casual se tornou cada vez mais popular nos
ltimos vinte anos e as interfaces baseadas em linguagens, que era
a forma na qual as pessoas interagiam com os computares, foram
amplamente substitudas por interfaces grficas. Mesmo assim, elas
estiver passando por dificuldades para acompanhar o livro, no tire
concluses imediatas sobre sua prpria capacidade. Voc estar
bem, apenas no desista. Tire um tempo de descanso, releia algum
material anterior e sempre se certifique de que leu e entendeu os
programas apresentados nos exemplos e nos exerccios. Aprender
um trabalho rduo, mas tudo o que for aprendido ser completamente
seu e ajudar com que o aprendizado posterior seja ainda mais fcil.
O programador um criador de universos nos quais ele o nico
regras rgidas ("boas prticas") recomendando a forma que os
responsvel. Universos com complexidades totalmente ilimitadas
programas deveriam ter. Os mais zelosos entre eles, vo considerar
podem ser criados na forma de programas de computador.
como maus programadores aqueles que saem dessa pequena zona
de segurana.
Joseph Weizenbaum, Computer Power and Human Reason
Quanta hostilidade em relao riqueza da programao, tentar
Um programa pode ser considerado muitas coisas. Ele um pedao
reduzi-l a algo simples e previsvel, colocando um tabu em todos os
de texto digitado por um programador, a fora que direciona o
estranhos e bonitos programas. A dimenso das tcnicas de
computador a fazer o que ele faz e, tambm, os dados contidos na
programao enorme e fascinante em sua diversidade e, ainda
memria do computador, controlando as aes executadas nessa
assim, amplamente inexplorada. certamente muito perigoso atrair
mesma memria. Analogias que tentam comparar programas aos
programadores inexperientes nesses tipos de confuses, entretanto,
objetos que conhecemos, normalmente tendem a ser insuficientes.
voc deve seguir com cautela e manter o seu senso comum em
Uma dessas comparaes superficiais com uma mquina, com
relao a elas. Conforme voc aprende, sempre haver novos
vrias partes separadas que normalmente esto relacionadas e, para
territrios e desafios a serem explorados. Programadores que se
fazer com que a mquina toda funcione, precisamos considerar a
recusam a continuar explorando iro estagnar, esquecer da alegria
maneira nas quais essas partes esto conectadas e como cada uma
que programar e acabaro ficando entediados com as coisas que
contribui para a operao da mquina como um todo.
constroem.
Um computador uma mquina construda para atuar como um
Porque linguagens importam?
hospedeiro para essas mquinas imateriais. Os computadores por si
ss, conseguem apenas fazer coisas fceis e pouco complicadas. A
razo deles serem to teis, que eles conseguem executar essas
coisas em uma velocidade incrivelmente rpida. Um programa pode
combinar uma grande quantidade dessas coisas simples a fim de
executar coisas mais complicadas.
No incio, quando a computao nasceu, no haviam linguagens de
programao. Os programas eram parecidos com algo assim:
00110001
00110001
00110011
01010001
00100010
01000011
01000001
00010000
01100010
00000000
00000001
00000001
00001011
00000010
00000001
00000001
00000010
00000000
00000000
00000001
00000010
00000010
00001000
00000000
00000001
00000000
00000000
Para alguns de ns, escrever programas de computador um
Esse um programa que soma os nmeros de 1 a 10 e imprime o
fascinante jogo. Um programa uma construo do pensamento.
resultado: 1
+ 2 + + 10 = 55.
Ele poderia ser executado em qualquer
No possui custos de construo, leve e cresce facilmente com a
mquina simples. Para programar os computadores antigos, era
digitao feita por nossas mos.
necessrio configurar longos conjuntos de chaves na posio correta
Entretanto, se no formos cuidadosos, o tamanho e a complexidade
ou, ento, fazer perfuraes em cartes que eram usados para
de um programa pode crescer e ficar fora de controle, confundindo,
alimentar o computador. Voc provavelmente deve estar imaginando
at mesmo, a pessoa que o criou. Manter os programas sob controle
como tedioso e propenso a erros esse procedimento era. At para
o maior desafio da programao. Quando um programa funciona,
escrever programas simples precisava de muita habilidade e
lindo. A arte de programar , basicamente, a habilidade de controlar
disciplina. Os programas mais complexos eram praticamente
a complexidade. Um timo programa suave e simples em sua
inimaginveis de serem criados.
prpria complexidade.
claro que inserir esses padres "arcanos" de bits (zeros e uns) dava
ao programador a profunda sensao de ser um poderoso mago, e
Muitos programadores acreditam que essa complexidade melhor
gerenciada usando, em seus programas, apenas um pequeno
conjunto de tcnicas bem entendidas. Eles criaram uma srie de
isso devia significar alguma coisa em relao ao sentimento de
satisfao em seu trabalho.
Cada linha do programa contm uma simples instruo. Isto pode ser
No
escrito assim:
operao console.log
1.
2.
3.
4.
5.
9.
6.
7.
8.
9.
escrevemos isso como output (sada).
Guarde o nmero 0 na posio da memria 0.
Guarde o nmero 1 na posio da memria 1.
Guarde o valor da posio da memria 1 na posio da memria 2.
Subtraia o nmero 11 do valor na posio da memria 2.
Se o valor na posio da memria 2 o nmero 0, continue com a instruo
final
do
programa,
depois
aplicada
ao
de while ser
resultado
ordem
a
que
Finalmente, aqui temos o que o programa pode parecer se ns
tivermos as operaes convenientes
Adicione o valor da posio da memria 1 para posio de memria 0.
Adicione o nmero 1 ao valor da posio de memria 1.
Continue com a instruo 3.
Retorne o valor da posio da memria 0.
na
definido,
range
(alcance) e sum(soma)
disponveis, que respectivamente criam uma coleo de nmeros
Embora isto seja mais legvel que a sopa de bits, ainda continua
com um alcance e computam a soma de uma coleo de nmeros:
console.log(sum(range(1,10)));
// 55
bastante desagradvel. Pode ser de auxlio usar nomes ao invs de
A moral da histria, ento, que o mesmo programa pode ser
nmeros para as instrues e locaes de memria:
expresso de forma longa e curta, de forma legvel ou no. A primeira
Configure "total" para 0
Configure "count" para 1
[loop]
Configure "compare" para "count"
Subtraia 11 de "compare"
Se "compare" zero, continue at [fim]
Adicione "count" em "total"
Adicione 1 em "count"
Continue at [loop]
[fim]
Sada "total"
verso do programa foi extremamente obscura, enquanto esta ltima
praticamente "Ingls": log (registre) a sum(soma) da range (extenso)
dos nmeros de 1 a 10. (Ns vamos ver nos prximos captulos como
criar coisas do tipo sume range).
Neste ponto no to difcil ver como os programas trabalham. Voc
consegue? As primeiras duas linhas fornecem duas locaes de
memria que iniciam os valores: total vai ser usado para construir o
resultado da computao, e count mantm registrado o nmero que
ns atualmente estamos olhando. As linhas usando
compare
so
provavelmente as mais estranhas. O que o programa quer fazer ver
Uma boa linguagem de programao ajuda o programador
permitindo-o conversar sobre aes que o computador vai realizar
em alto nvel. Isto ajuda a deixar detalhes desinteressantes implcitos,
e
fornece
construes
convenientes
de
blocos
(como
o while e console.log), permitindo a voc definir seus prprios blocos
(como sum e range), e tornando simples a construo destes blocos.
se j pode parar. Por causa da nossa mquina hipottica ser bastante
primitiva, ela somente pode testar se um nmero zero e fazer a
O que JavaScript?
deciso (salto) baseado nisto. Ento, ela usa a locao de memria
O JavaScript foi introduzido em 1995, como uma forma de adicionar
rotulada compare para computar o valor de count - 11 e fazer a deciso
programas a pginas da web no navegador Netscape. A linguagem
baseada neste valor. As prximas duas linhas adicionam o valor
foi adaptada pela maioria dos navegadores grficos da web. Ele fez
de count ao resultado e incrementam
count
por 1 cada vez que o
a atual gerao de aplicaes web possvel - clientes de email
programa decide que no 11 ainda.
baseado no navegador, mapas e redes sociais - e tambm usado
Aqui temos o mesmo programa em JavaScript:
em sites mais tradicionais para fornecer vrias formas de
var total = 0, count = 1;
while (count <= 10) {
total += count;
count += 1;
}
console.log(total);
interatividade e inteligncia.
importante notar que JavaScript no tem quase nada a ver com a
Isso nos d muitas melhorias. E o mais importante, no preciso
linguagem de programao Java. O nome similar foi inspirado por
mais especificar o caminho que ns queremos que o programa salte
consideraes de marketing, ao invs do bom senso. Quando o
anteriormente ou adiante. Ele continua executando o bloco (envolvido
JavaScript foi introduzido, a linguagem Java estava sendo fortemente
nas chaves) at que a condio que foi dada seja:
que
divulgada e ganhando popularidade. Algum pensou ser uma boa
significa "count menor que ou igual a 10". No temos mais que criar
ideia tentar trilhar junto com este sucesso. Agora estamos
um valor temporrio e compar-lo a zero. Isso um detalhe
emperrados com este nome.
count <= 10,
desinteressante, e o poder das linguagens de programao que
Depois da adoo fora do Netscape, um documento padro foi escrito
elas tomam conta de detalhes desinteressantes para ns.
para descrever uma forma que a linguagem deve trabalhar, com um
esforo para certificar-se que as vrias partes do software que
JavaScript como sua linguagem de consulta e script. Muitas
afirmavam suportar JavaScript estavam realmente falando sobre a
plataformas para desktop e de programao no servidor, mais notvel
mesma linguagem. Foi chamado de padro ECMAScript, depois da
o projeto Node.JS, sujeito do captulo (AINDA NO ESCRITO),
organizao ter feito a padronizao. Na prtica, os termos
fornecem um poderoso ambiente de programao JavaScript fora do
ECMAScript e JavaScript podem ser usados como sinnimos - so
navegador.
dois nomes para a mesma linguagem.
Cdigo, e o que fazer com ele
Tem alguns que vo dizer coisas horrveis sobre a linguagem
JavaScript. Muitas dessas coisas so verdade. Quando eu fui
obrigado a escrever algo em JavaScript, pela primeira vez, eu
rapidamente vim a desprez-lo - ele poderia interpretar qualquer
coisa que eu digitei, mas interpretava de uma forma completamente
diferente do que eu quis dizer. Isso teve muito a ver com o fato de
que eu no tinha a menor ideia do que estava fazendo, claro, mas h
uma questo real aqui: JavaScript ridiculamente liberal no que ele
permite. A ideia por trs deste padro foi que isto tornaria a
programao em JavaScript simples para iniciantes. Na realidade, na
maior parte das vezes isto torna a deteco de problemas em seus
programas difcil, porque o sistema no vai apont-lo para voc.
Esta flexibilidade tambm tem suas vantagens. Isso d espao para
muitas tcnicas que so impossveis em linguagens mais rgidas, e,
como iremos ver em captulos posteriores, isto pode ser usado para
Cdigo o texto que compe os programas. Muitos captulos deste
livro contm muito cdigo. Em minha experincia, escrever e ler
cdigos uma importante parte do aprendizado da programao.
Tenta no apenas olhar sobre os cdigos, leia-os atenciosamente e
os entenda. Isto pode ser lento e confuso no incio, mas eu prometo
que voc vai rapidamente pegar o jeito. O mesmo acontece para os
exerccios. No assuma que voc os entendeu at que voc
realmente tenha escrito uma soluo que funcione.
Eu recomendo que voc teste suas solues dos exerccios em um
interpretador JavaScript real, para obter um feedback se o que voc
fez est funcionando ou no, e, esperanosamente, ser incentivado
a experimentar e ir alm dos exerccios.
Quando ler este livro no seu navegador, voc pode editar (e rodar) os
programas exemplo clicando neles.
superar algumas deficincias do JavaScript. Depois de aprender
corretamente e trabalhar com o JavaScript por um tempo, eu aprendi
Rodando programas JavaScript fora do contexto deste livro
a realmente gostar desta linguagem.
possvel tambm. Voc pode optar por instalar o node.js, e ler a
documentao para conhecer como us-lo para avaliar arquivos de
Tivemos vrias verses do JavaScript. Verso 3 do ECMAScript foi a
dominante, largamente suportado no tempo que o JavaScript
ascendia para o domnio, aproximadamente entre 2000 e 2010.
Durante este tempo, trabalho estava em andamento na verso 4
ambiciosa, que planeja um nmero de melhorias e extenses radicais
para a linguagem. Porm, mudar de forma radical uma linguagem
largamente usada pode ser politicamente difcil, e o trabalho na
texto que contm programas. Ou voc pode usar o console de
desenvolvedores no navegador (tipicamente encontrado no menu
"tools" ou "developer") e divertir-se nele. No captulo (CORRIGIR!), o
jeito que os programas so embutidos em pginas web (arquivos
HTML)
explicado.
Entretanto,
voc
pode
verificar
em http://jsbin.com por outra interface amigvel para rodar cdigo
JavaScript no navegador.
verso 4 foi abandonado em 2008, e conduzido para a 5 edio que
saiu em 2009. Estamos agora esperando que todos os maiores
Convenes Tipogrficas
navegadores suportem a 5 edio, que a linguagem da verso que
este livro vai focar. O trabalho na 6 edio est em curso.
Neste livro, texto escrito em fonte monoespaada deve ser entendido por
representaes de elementos dos programas - algumas vezes so
Navegadores web no so as nicas plataformas que o JavaScript
usado. Alguns banco de dados, como MongoDB e CouchDB, usam
fragmentos auto-suficientes, e algumas vezes eles somente
referenciam para alguma parte de um programa prximo. Programas
so os bits que compem o nmero treze, com o valor dos dgitos
(que voc j viu um pouco), so escritos assim:
mostrados abaixo deles:
function fac(n) {
if (n == 0)
return 1;
else
return fac(n - 1) * n;
}
0
128
Algumas vezes, para mostrar a sada que o programa produz, a
Valores
0
64
0
32
0
16
1
8
1
4
0
2
1
1
Ento este o 00001101, ou 8 + 4 + 1, que equivale a 13.
mesma ser escrita abaixo dele, com duas barras e uma seta na
frente:
Imagine um mar de bits. Um oceano deles. Um computador moderno
console.log(fac(8));
// 40320
tem mais de trinta bilhes de bits em seu armazenamento voltil
(memria RAM). De armazenamento no-voltil (o disco rgido ou
Boa Sorte!
Valores,
Tipos
Operadores
equivalente) tende a ter uma ordem de magnitude ainda maior.
Abaixo da parte superficial da mquina, existe um programa que
desloca-se. Sem esforo, ele se expande e se contrai. Com grande
harmonia, os eltrons se espalham e se reagrupam. As formas no
monitor so como ondulaes na gua. A essncia permanece
invisvel por baixo.
Master Yuan-Ma, The Book of Programming
Dentro do mundo do computador, h somente dados. Ns podemos
ler dados, modificar dados, criar dados - mas coisas que no so
representadas por dados simplesmente no existem. Todos estes
dados so armazenados em longas sequncias de bits, e isso
portanto fundamentalmente parecido.
Bits podem ser qualquer tipo de coisa com 2 valores, usualmente
descrito como 0 e 1. Dentro do computador, eles tomam formas como
uma carga eltrica alta ou baixa, um forte ou fraco sinal, ou um ponto
brilhante ou sem brilho na superfcie de um CD. Qualquer pedao de
uma discreta informao, pode ser reduzida para uma sequncia de
0 e 1, e ento representanda por bits.
Para trabalhar com estes sem se perder, ns temos que estrutur-los
de alguma forma. Uma forma de fazer agrup-los dentro de
pedaos que representam uma simples parte de informao. Em um
ambiente JavaScript, todo os dados so separados em coisas
chamadas valores, grupos de bits que representam um pedao de
Como um exemplo, pense sobre a maneira que o nmero 13 pode
dado coerente.
ser armazenado em bits. A forma usual de se fazer esta analogia a
forma de escrevermos nmeros decimais, mas ao invs de 10 dgitos,
temos apenas 2. E, ao invs de o valor de um dgito aumentar dez
vezes sobre o dgito aps ele, o valor aumenta por um fator 2. Estes
Embora todos os valores sejam feitos da mesma coisa uniforme, eles
desempenham papis diferentes. Todo valor tem um tipo, que
determina o tipo de papel que desempenha. Temos seis tipos bsicos
de valores no JavaScript: nmeros, strings, booleans, objetos,
Todos
os
nmeros
funes e valores indefinidos.
JavaScript number.
abaixo
Estes
bits
de
18
tambm
quintilhes
cabem
armazenam
no
nmeros
negativos, onde um destes sinais usado para guardar o sinal do
Em ingls: [number, string, boolean, object, function, undefined]
Para criar um valor, deve-se simplesmente invocar seu nome. Isto
muito conveniente. Voc no tem que recolher material para construir
seus valores ou pagar por eles; voc s chama por um, e pronto, voc
o tem. Eles no so criados com ar, obviamente. Todo valor tem que
nmero. Uma grande questo que nmeros no inteiros podem ser
representados. Para fazer isso, alguns bits so usados para guardar
a posio do ponto decimal do nmero. O maior nmero no inteiro
que pode ser armazenado est na faixa de 9 quadrilhes (15 zeros) que continua muito grande.
ser armazenado em algum lugar, e se voc quer usar uma quantidade
gigante deles, ao mesmo tempo voc deve rodar sobre os bits.
Nmeros fracionados so escritos usando o ponto:
Felizmente, este um problema somente se voc os quiser
9.81
simultaneamente. Assim que voc no usar mais um valor, ele ser
Para grandes nmeros ou nmeros pequenos, podemos usar a
dissipado, deixando para trs os bits para serem reciclados e se
notao cientfica adicionando um 'e', seguido do expoente:
tornarem materiais para a prxima gerao de valores.
2.998e8
Isto 2.998 x 10 = 299800000.
Este captulo introduz os elementos atmicos dos programas
JavaScript: Simples tipos de valores, e operadores que podem atuar
Clculos com nmeros inteiros (tambm chamados integers)
em cada valor.
menores que os mencionados 9 quadrilhes so garantidos de
Nmeros
sempre serem precisos. Infelizmente clculos com nmeros
fracionrios no so, geralmente. Como (pi) no pode ser
Valores do tipo numbers so, previsivelmente, valor numricos. Em
um programa JavaScript, eles so escritos usualmente assim:
precisamente expresso por uma quantidade finita de dgitos decimais,
vrios nmeros perdem a preciso quando somente 64 bits esto
disponveis para armazen-los. Isto uma vergonha, porm causa
13
Coloque isto em um programa, e isto vai gerar o padro de bits para
que o nmero 13 comece a existir dentro do computador.
problemas somente em situaes muito especficas. O importante
estar ciente disto e tratar nmeros fracionrios digitais como
aproximaes, no como valores precisos.
O JavaScript usa um nmero fixo de bits, 64 deles, para armazenar
Aritmtica
um nico valor numrico. Isto significa que existe uma quantidade
limite de tipos diferentes de nmeros que podem ser representados h muitos padres diferentes que voc pode criar com 64 bits. O
conjunto de nmeros podem ser representados por N dgitos
decimais 10^N. Similarmente, o conjunto de nmeros que podem
A principal coisa a se fazer com nmeros aritmtica. Operaes
aritmticas como adio e multiplicao pegam o valor de dois
nmeros e produzem um novo nmero a partir deles. Aqui vemos
como eles so no JavaScript:
ser representados por 64 dgitos binrios 2, que mais ou menos
100 + 4 * 11
18 quintilhes (um 18 com 18 zeros aps ele).
Isto muito. Nmeros exponenciais tem o hbito de ficarem grandes.
J foi o tempo que as memrias eram pequenas e as pessoas
tendiam a usar grupos de 8 ou 16 bits para representar estes
nmeros. Era fcil de acidentalmente "transbordarem" estes
pequenos nmeros. Hoje, temos o luxo de somente se preocupar
quando realmente lidamos com nmeros astronmicos.
Os smbolos + e * so chamados operadores. O primeiro representa
adio, e o segundo representa multiplicao. Colocando um
operador entre 2 valores faz com que se aplique o mesmo,
produzindo um novo valor.
O prximo exemplo significa "adicione 4 e 100, e multiplique o
resultado por 11", ou a multiplicao feita antes da adio? Como
voc deve ter pensado, a multiplicao acontece primeiro. Mas, como
na matemtica, isto pode ser mudado envolvendo a adio com os
O prximo tipo bsico de dado a string. Strings so usadas para
parnteses:
representar texto. Elas so escritas delimitando seu contedo entre
(100 + 4) * 11
aspas:
Para subtrao, este o operador -, e para a diviso usamos este
"Patch my boat with chewing gum"
'Monkeys wave goodbye'
operador /.
Ambas as aspas simples e duplas podem ser usadas para marcar
Quando operadores aparecem juntos sem parnteses, a ordem que
eles
vo ser
aplicados
determinada
strings - contanto que as aspas no incio e no fim da string combinem.
pela precednciados
operadores. O exemplo mostra que a multiplicao vem antes da
Quase tudo pode ser colocado entre aspas, e o JavaScript vai fazer
adio. / tem a mesma precedncia de *. Igualmente para + e -.
um valor de string com isso. Mas alguns caracteres so difceis. Voc
Quando mltiplos operadores com a mesma precedncia esto
pode imaginar como colocar aspas entre aspas deve ser difcil. Novas
prximos uns aos outros (como em1
linhas, as coisas que voc obtm quando pressiona
- 2 + 1),
eles so aplicados da
enter,
tambm
esquerda para a direita.
no podem ser colocadas entre aspas - a string tem que estar em
Estas regras de precedncia no algo que voc deva se preocupar.
uma linha nica.
Quando em dvida, somente adicione parnteses.
Para ser capaz de ter estes caracteres em uma string, a conveno
seguinte usada: Sempre que um barra invertida \ encontrada
H mais um operador aritmtico, que possivelmente menos familiar.
O smbolo % usado para representar o restante da operao. X
o restante da diviso de X
% 12
por Y.
Por exemplo, 314
% 100
% Y
produz 14, e 144
nos d 0. A precedncia deste operador igual a da multiplicao
e diviso. Voc tambm pode ver este operador sendo referido como
"mdulo" (porm tecnicamente "restante" mais preciso).
dentro do texto entre aspas, isto indica que o caracter depois desta
tem um significado especial. Uma aspa precedida de uma barra
invertida no vai findar a string, mas ser parte dela. Quando um
caracter 'n' correr depois de uma barra invertida, ser interpretado
como uma nova linha. Similarmente, um 't' depois da barra invertida
significa o caracter tab. Veja a string seguinte:
"This is the first line\nAnd this is the second"
Nmeros Especiais
O verdadeiro texto contido :
Existem 3 valores especiais no JavaScript que so considerados
This is the first line
And this is the second
nmeros, mas no comportam-se como nmeros normais.
Existe, obviamente, situaes onde voc quer uma barra invertida em
Os dois primeiros so Infinity e -Infinity, que so usados para
uma string apenas como uma barra invertida. no um cdigo especial.
representar os infinitos positivo e negativo.
continua
Se duas barras invertidas estiverem seguidas uma da outra, elas se
sendo Infinity, e assim por diante. Mas no ponha muita confiana
anulam, e somente uma vai ser deixada no valor da string resultante.
neste tipo de computao baseada em infinito, pois uma
Assim como a string A
matemtica pesada, e vai rapidamente levar para nosso prximo
written:
"A newline character is written like \"\\n\"."
Infinity
newline character is written like "\n" can be
nmero especial: NaN.
Strings no podem ser divididas, multiplicadas ou subtradas, mas o
NaN
significa "not a number" (no um nmero). Voc obtm isso
operador + pode ser usado nelas. Ele no adiciona, mas concatena -
quando declara 0
/ 0
(zero dividido por zero),
Infinity - Infinity,
ou
ele cola duas strings unindo-as. A linha seguinte vai produzir a
qualquer nmero de outra operao numrica que no produz um
string concatenate:
preciso e significante valor.
"con" + "cat" + "e" + "nate"
Strings
Existem outras maneiras de manipular strings, que ns vamos discutir
quando entrarmos ns mtodos no captulo 4.
Operadores Unrios
Nem todos operadores so smbolos. Alguns so palavras escritas.
nmeros prtico para guardar strings dentro do computador - voc
Um exemplo o operador typeof, que produz uma string com o valor
pode represent-los como uma sequncia de nmeros. Quando se
do tipo dado para fornecido para avaliao.
compara strings, o JavaScript vai sobre elas da esquerda para a
console.log(typeof 4.5)
// number
console.log(typeof "x")
// string
direita, comparando os cdigos numricos dos caracteres um por um.
Outros operadores similares so >= (maior que ou igual a), <= (menor
Ns vamos usar console.log nos cdigos exemplo para indicar que
que ou igual a), == (igual a) e != (no igual a).
ns queremos ver o resultado da avaliao de algo. Quando voc
roda algum cdigo, o valor produzido vai ser mostrado na tela - de
alguma forma, dependendo do ambiente JavaScript que voc usa
console.log("Itchy" != "Scratchy")
// true
H somente um valor no JavaScript que no igual a ele mesmo,
que o NaN (not a number).
console.log(NaN == NaN)
// false
para rod-lo.
Os outros operadores que vimos sempre operam
com 2
NaN
(not a number) supostamente define o resultado de uma
valores; typeof pega somente um. Operadores que usam 2 valores
operao sem sentido, e como tal, no ser igual ao resultado
so chamados operadores binrios, enquanto aqueles que pegam
de outra operao sem sentido.
um so chamados operadores unrios. O operador menos - pode ser
Operadores Lgicos
usado como operador binrio e unrio.
console.log(- (10 - 2))
// -8
Temos tambm algumas operaes que podem ser aplicadas aos
Valores Booleanos
valores
booleanos.
JavaScript
suporta
operadores
lgicos: e, ou ou no.
As vezes, voc vai precisar de um valor que simplesmente distingue
entre 2 possibilidades, "sim" ou "no", ou "ligado" e "desligado". Para
O operador && representa o e lgico. um operador binrio, e seu
isso o JavaScript tem um tipo booleano, que tem apenas dois
resultado true (verdadeiro) somente se ambos os valores dados a
valores, true e false (que so escritos com estas palavras mesmo).
ele forem true.
Comparaes
Aqui temos uma maneira de produzir valores booleanos:
console.log(3 > 2)
// true
console.log(3 < 2)
// false
console.log(true && false);
// false
console.log(true && true);
// true
O operador || denota ao ou lgico. Ele produz true se algum dos
valores fornecidos for true:
console.log(false || true);
// true
console.log(false || false);
// false
Os sinais > e < so tradicionalmente smbolos para " maior que" e "
No escrito com uma exclamao !. um operador unrio que
menor que". Eles so operadores binrios, e o resultado da aplicao
inverte o valor dado a ele - !true produz false e!false produz true.
deles um valor booleano que indica se eles so verdadeiros neste
Quando misturamos estes operadores booleanos com operadores
caso.
aritmticos e outros operadores, no sempre bvio quando o
Strings podem ser comparadas da mesma forma:
parnteses necessrio. Na prtica, voc precisa conhecer sobre os
console.log("Aardvark" < "Zoroaster")
// true
operadores que vimos antes, e que || tem o mais baixo nvel de
A maneira que as strings so ordenadas mais ou menos alfabtica:
precedncia, seguido do &&, e ento os operadores de comparao
Letras maisculas so sempre "menores" que as minsculas,
(>, ==, e outros), e depois o resto. Sendo assim, como vemos na
ento "Z"
expresso abaixo, os parnteses poucas vezes so necessrios.
< "a"
true, e caracteres no alfabticos ('!', '-', e assim por
1 + 1 == 2 || 10 * 10 <= 100
diante) so tambm includos na ordenao. A maneira real da
comparao feita baseada no padro Unicode. Este padro atribui
um nmero a todo caracter virtual que pode ser usado, incluindo
caracteres da Grcia, Arbia, Japo, Tamil e por ai vai. Ter estes
Valores Indefinidos
Temos dois valores especiais,
e undefined, que so usados para
casos ir ocorrer a tentativa de converso de um dos valores para o
denotar a ausncia de valores significativos. Eles so por si prprios
tipo do outro valor. Contudo, quando nullou undefinedocorrem em
valores, porm valores que no levam informao.
algum dos lados do operador, isso produzir true somente se ambos
Muitas operaes na linguagem que no produzem valores
os lados forem
significativos (vamos ver algumas no prximo captulo) vo
A ltima parte do comportamento frequentemente muito til.
produzir undefined,
Quando voc quer testar se um valor tem um valor real, em vez de
null
simplesmente
porque
elas
tem
que
null
ou undefined.
retornar algum valor.
ser null ou undefined, voc pode simplesmente compar-lo a null com
A diferena de significado entre undefined e null em grande parte
o operador == (ou !=).
desinteressante e um acidente no projeto do JavaScript. Nos casos
Mas e se voc quiser testar se algo se refere ao valor preciso
que voc realmente tiver que se preocupar com estes valores, eu
As regras de converso de strings e nmeros para valores booleanos
recomendo trat-los como substituveis (mais sobre isso em um
afirmam que 0, NaN e empty strings contam como false, enquanto
momento).
todos os outros valores contam como
Converso Automtica de Tipo
expresses como 0
== false
e ""
== false
true.
false?
Por causa disso,
retornam
true.
Para casos
assim, onde vocno quer qualquer converso automtica de tipos
Na introduo, eu mencionei que o JavaScript no iria atrapalh-lo e
aceitaria quase qualquer coisa que voc o fornecesse, mesmo
quando isso confuso e errado. Isto muito bem demonstrado por
acontecendo, existem dois tipos extras de operadores:
===
e !==. O
primeiro teste se o valor precisamente igual ao outro, e o segundo
testa se ele no precisamente igual. Ento ""
=== false
falso como
esperado.
esta expresso:
Usar
console.log(8 * null)
// 0
console.log("5" - 1)
// 4
console.log("5" + 1)
// 51
console.log("five" * 2)
// NaN
console.log(false == 0)
// true
os
operadores
de
comparao
de
trs
caracteres
defensivamente, para prevenir inesperadas converses de tipo que o
faro tropear, algo que eu recomendo. Mas quando voc tem
certeza de que os tipos de ambos os lados sero iguais, ou que eles
vo ser ambos null/undefined, no h problemas em usar os
Quando um operador aplicado a um tipo de valor "errado", ele vai
operadores curtos.
silenciosamente converter este valor para o tipo que quiser, usando
um conjunto de regras que frequentemente no so as que voc
O Curto-Circuito de && e ||
expera. O null na primeira expresso torna-se 0, o "5" na segunda
expresso se torna 5 (de string para nmero), ainda na terceira
expresso, o + tenta a concatenao de strings antes de tentar a
adio numrica, o 1 convertido em "1" (de nmero para string).
Quando algo que no pode ser mapeado como um nmero de forma
bvia, do tipo "five" ou undefined convertido para um nmero, o
valor NaN produzido. Operaes aritmticas com
NaN
continuam
produzindo NaN, ento se voc encontrar alguns destes resultados em
algum local inesperado, procure por converses acidentais de tipo.
Quando comparamos coisas do mesmo tipo usando ==, o resultado
bastante fcil de se prever - voc vai obter truequando ambos os
valores forem os mesmos. Mas quando os tipos diferem, o JavaScript
usa um complicado e confuso conjunto de regras para determinar o
que fazer. Eu no vou explicar isto precisamente, mas na maioria dos
Os operadores lgicos && e || tem uma maneira peculiar de lidar com
valores de tipos diferentes. Eles vo converter o valor sua esquerda
para o tipo booleano a fim de decidir o que fazer, mas ento,
dependendo do operador e do resultado da converso, eles ou
retornam o valor esquerda original, ou o valor direita.
O operador || vai retornar o valor sua esquerda quando ele puder
ser convertido em true, ou valor sua direita caso contrrio. Ele faz a
coisa certa para valores booleanos, e vai fazer algo anlogo para
valores de outros tipos. Isso muito til, pois permite que o operador
seja usado para voltar um determinado valor predefinido.
console.log(null || "user")
// user
console.log("Karl" || "user")
// Karl
O operador && trabalha similarmente, mas ao contrrio. Quando o
No Captulo 1 ns criamos alguns valores e ento aplicamos
valor sua esquerda algo que se torne false, ele retorna o valor, e
operadores para obter novos valores. Criar valores desta forma uma
caso contrrio ele retorna o valor sua direita.
parte essencial de todo programa JavaScript, mas isso somente
Outro importante propriedade destes 2 operadores que a expresso
uma parte. Um fragmento de cdigo que produz um valor chamado
a sua direita avaliada somente quando necessrio. No caso de true
de expresso.
|| X,
no importa o que X - pode ser uma expresso que faa
(como 22 ou "psychoanalysis") uma expresso. Uma expresso entre
algo terrvel - o resultado vai ser verdadeiro, e X nunca avaliado. O
parnteses tambm uma expresso, e tambm um operador binrio
mesmo acontece para false
aplicado a duas expresses, ou um unrio aplicado a uma.
&& X,
que falso, e vai ignorar X.
Todo
valor
que
escrito
literalmente
Isso mostra parte da beleza da interface baseada na linguagem.
Resumo
Expresses podem ser encadeadas de forma semelhante s subNs vimos 4 tipos de valores do JavaScript neste captulo. Nmeros,
frases usadas na linguagem humana - uma sub-frase pode conter sua
prpria sub-frase, e assim por diante. Isto nos permite combinar
strings, booleanos e valores indefinidos.
expresses para expressar computaes complexas arbitrariamente.
Alguns valores so criados digitando seu nome (true, null) ou valores
(13, "abc"). Eles podem ser combinados e transformados com
operadores. Ns vimos operadores binrios para aritmtica (+, -, *, /,
e %),
um
para
concatenao
de
string
(+),
comparao
(==, !=, ===, !==, <, >, <=, >=) e lgica (&&, ||), como tambm vrios
operadores unrios (- para negativar um nmero, ! para negar uma
lgica, e typeof para encontrar o tipo do valor).
Isto lhe d informao suficiente para usar o JavaScript como uma
calculadora de bolso, mas no muito mais. O prximo captulo vai
Se uma expresso corresponde a um fragmento de sentena,
uma afirmao, no JavaScript, corresponde a uma frase completa em
linguagem humana. Um programa simplesmente uma lista de
afirmaes.
O tipo mais simples de afirmao uma expresso com um ponto e
vrgula depois dela. Este o programa:
1;
!false;
comear a amarrar essas operaes bsicas conjuntamente dentro
um programa intil, entretanto. Uma expresso pode ser apenas
de programas bsicos.
para produzir um valor, que pode ento ser usado para fechar a
Estrutura do Programa
expresso. Uma declarao vale por si s, e s equivale a alguma
coisa se ela afeta em algo. Ela pode mostrar algo na tela - que conta
como mudar algo - ou pode mudar internamente o estado da mquina
O meu corao vermelho brilha nitidamente sob minha pele e ele tm
que administrar 10cc de JavaScript para fazer com que eu volte (Eu
respondi bem a toxinas no sangue). Cara, esse negcio vai chutar os
pssegos de direita para fora!
de uma forma que vai afetar outras declaraes que iro vir. Estas
mudanas so chamadas efeitos colaterais. As afirmaes nos
exemplos anteriores somente produzem o valor 1 e true e ento
imediatamente os jogam fora novamente. No deixam nenhuma
impresso no mundo. Quando executamos o programa, nada
_why, Why's (Poignant) Guide to Ruby
acontece.
Este o ponto onde ns comeamos a fazer coisas que podem
Ponto e vrgula
realmente ser chamadas de programao. Ns vamos expandir
nosso domnio da linguagem JavaScript para alm dos substantivos
Em alguns casos, o JavaScript permite que voc omita o ponto e
e fragmentos de sentenas que ns vimos anteriormente, para o
vrgula no fim de uma declarao. Em outros casos ele deve estar l
ponto onde poderemos realmente expressar algo mais significativo.
ou coisas estranhas iro acontecer. As regras para quando ele pode
Expresses e Afirmaes
ser seguramente omitido so um pouco complexas e propensas a
erro. Neste livro todas as declaraes que precisam de ponto e
mantm tem o poder de ser acessado por ele. Quando voc precisa
vrgula vo sempre terminar com um. Eu recomendo a voc fazer o
se lembrar de algo, voc aumenta o tentculo para segurar ou
mesmo em seus programas, ao menos at voc aprender mais sobre
recoloca um de seus tentculos existentes para fazer isso.
as sutilezas envolvidas em retirar o ponto e vrgula.
Quando voc define uma varivel sem fornecer um valor a ela, o
Variveis
tentculo fica conceitualmente no ar - ele no tem nada para segurar.
Quando voc pergunta por um valor em um lugar vazio, voc recebe
Como um programa mantm um estado interno? Como ele se lembra
o valor undefined.
das coisas? Ns vimos como produzir novos valores com valores
antigos, mas isso no altera os valores antigos, e o valor novo deve
ser imediatamente usado ou vai ser dissipado. Para pegar e guardar
valores, o JavaScript fornece uma coisa chamada varivel.
var caught = 5 * 5;
E isso nos d um segundo tipo de declarao. A palavra especial
(palavra-chave) var indica que esta sentena vai definir uma varivel.
Ela seguida pelo nome da varivel e, se ns quisermos d-la
imediatamente um valor, por um operador = e uma expresso.
A declarao anterior criou uma varivel chamada
caught
e a usou
para armazenar o valor que foi produzido pela multiplicao 5 por 5.
Depois de uma varivel ter sido definida, seu nome pode ser usado
como uma expresso. O valor da expresso o valor atual mantido
pela varivel. Aqui temos um exemplo:
var ten = 10;
console.log(ten * ten);
// 100
Nomes de variveis podem ser quase qualquer palavra, menos as
reservadas para palavras-chave (como var). No pode haver espaos
includos. Dgitos podem tambm ser parte dos nomes de variveis
Um exemplo. Para lembrar da quantidade de dlares que Luigi ainda
- catch22 um nome vlido, por exemplo - mas um nome no pode
lhe deve, voc cria uma varivel. E ento quando ele lhe paga 35
iniciar com um dgito. O nome de uma varivel no pode incluir
dlares, voc d a essa varivel um novo valor.
pontuao, exceto pelos caracteres $ e _.
var luigisDebt = 140;
luigisDebt = luigisDebt - 35;
console.log(luigisDebt);
// 105
Quando uma varivel aponta para um valor, isso no significa que
estar ligada ao valor para sempre. O operador = pode ser usado a
qualquer hora em variveis existentes para desconect-las de seu
Palavras-chave
Reservadas
Palavras
valor atual e ento apont-las para um novo:
var mood = "light";
console.log(mood);
// light
mood = "dark";
console.log(mood);
// dark
Palavras que tem um significado especial, como
usadas
como
nomes
de
chamadas keywords (palavras-chave).
var,
variveis.
Existe
no podem ser
Estas
tambm
so
algumas
Voc deve imaginar variveis como tentculos, ao invs de caixas.
palavras que so reservadas para uso em futuras verses do
Elas no contm valores; elas os agarram - duas variveis podem
JavaScript. Estas tambm no so oficialmente autorizadas a serem
referenciar o mesmo valor. Somente os valores que o programa
utilizadas como nomes de variveis, embora alguns ambientes
JavaScript as permitam. A lista completa de palavras-chave e
a string que foi passada como o texto a ser mostrado na caixa de
palavras reservadas um pouco longa:
dilogo. Os valores passados para funes so chamados
break case catch continue debugger default delete do else false finally for f
de arguments (argumentos). A funo alert precisa somente de um
unction if implements ininstanceof interface let new null package private pro
deles, mas outras funes podem precisar de diferentes quantidades
tected public return static switch throw true trytypeof var void while with y
ou tipos de argumentos.
ield this
A Funo console.log
No se preocupe em memoriz-las, mas lembre-se que este pode ser
A funo alert pode ser til como sada do dispositivo quando
o problema quando algo no funcionar como o esperado.
experimentada, mas clicar sempre em todas estas pequenas janelas
O Ambiente
vai lhe irritar. Nos exemplos passados, ns usamos console.log para
sada de valores. A maioria dos sistemas JavaScript (incluindo todos
A coleo de variveis e seus valores que existem em um
determinado tempo chamado de environment (ambiente). Quando um
programa inicia, o ambiente no est vazio. Ele ir conter no mnimo
o nmero de variveis que fazem parte do padro da linguagem. E
na maioria das vezes haver um conjunto adicional de variveis que
fornecem maneiras de interagir com o sistema envolvido. Por
exemplo, em um navegador, existem variveis que apontam para
funcionalidades que permitem a voc inspecionar e influenciar no
atual carregamento do website, e ler a entrada do mouse e teclado
os
navegadores
modernos
Node.js),
fornecem
uma
funo console.log que escreve seus argumentos como texto na sada
do dispositivo. Nos navegadores, a sada fica no console JavaScript.
Esta parte da interface do browser fica oculta por padro, mas muitos
browsers abrem quando voc pressiona F12, ou no Mac, quando voc
pressiona Command
+ option + I.
Se isso no funcionar, busque no menu
algum item pelo nome de web console ou developer tools.
Quando rodarmos os exemplos ou seu prprio cdigo nas pginas
deste livro, o console.log vai mostrar embaixo o exemplo, ao invs de
ser no console JavaScript.
da pessoa que est usando o navegador.
var x = 30;
console.log("o valor de x ", x);
// o valor de x 30
Funes
Embora eu tenha afirmado que nomes de variveis no podem conter
Muitos dos valores fornecidos no ambiente padro so do
pontos, console.log claramente contm um ponto. Eu no tinha
tipo function (funo). Uma funo um pedao de programa
mentido para voc. Esta no uma simples varivel, mas na verdade
envolvido por um valor. Este valor pode ser aplicado a fim de executar
uma expresso que retorna o campolog do valor contido na
o programa envolvido. Por exemplo, no ambiente do navegador, a
varivel console. Ns vamos entender o que isso significa no captulo
varivel alert detm uma funo que mostra uma pequena caixa de
4.
dilogo com uma mensagem. usada da seguinte forma:
Retornando Valores
alert("Good morning!");
Mostrar uma caixa de dilogo ou escrever texto na tela um efeito
colateral. Muitas funes so teis por causa dos efeitos que elas
produzem. tambm possvel para uma funo produzir um valor, no
Executar uma funo denominado invocar, chamar ou aplicar uma
funo. Voc pode chamar uma funo colocando os parnteses
depois da expresso que produz um valor de funo. Normalmente
caso de no ser necessrio um efeito colateral. Por exemplo, temos
a funo Math.max, que pega dois nmeros e retorna o maior entre
eles:
console.log(Math.max(2, 4));
voc ir usar o nome da varivel que contm uma funo
Quando uma funo produz um valor, dito que ela retorna (return)
diretamente. Os valores entre os parnteses so passados ao
ele. Em JavaScript, tudo que produz um valor uma expresso, o
programa dentro da funo. No exemplo, a funo
alert
usou
que significa que chamadas de funo podem ser usadas dentro de
expresses maiores. No exemplo abaixo, uma chamada para a
A funo Number converte o valor para um nmero. Ns precisamos
funo Math.min, que o oposto de Math.max, usada como uma das
dessa converso pois o resultado de prompt um valor do tipo string,
entradas para o operador de soma:
ns
queremos
um
nmero.
Existem
funes
similares
console.log(Math.min(2, 4) + 100);
chamadas String e Boolean que convertem valores para estes tipos.
O prximo captulo explica como ns podemos escrever nossas
prprias funes.
prompt
Aqui podemos ver uma representao bem trivial do fluxo de controle
em linha reta:
e confirm
O ambiente fornecido pelos navegadores contm algumas outras
funes para mostrar janelas. Voc pode perguntar a um usurio uma
questo
Ok/Cancel
usando confirm.
Isto
retorna
um
valor
Execuo Condicional
booleano: true se o usurio clica em OK e falsese o usurio clica
em Cancel.
Executar declaraes em ordem linear no a nica opo que
confirm("Shall we, then?");
temos. Uma alternativa a execuo condicional, onde escolhemos
entre duas rotas diferentes baseado em um valor booleano, como
ilustra a seguir:
prompt
pode ser usado para criar uma questo "aberta". O primeiro
argumento a questo; o segundo o texto que o usurio inicia. Uma
linha do texto pode ser escrita dentro da janela de dilogo, e a funo
vai retornar isso como uma string.
prompt("Tell me everything you know.", "...");
Estas duas funes no so muito usadas na programao moderna
para web, principalmente porque voc no tem controle sobre o modo
A execuo condicional escrita, em JavaScript, com a palavra-
que a janela vai aparecer, mas elas so teis para experimentos.
chave if. No caso mais simples, ns queremos que algum cdigo
Fluxo de Controle
seja executado se, e somente se, uma certa condio existir. No
programa anterior, por exemplo, podemos mostrar o quadrado do
dado fornecido como entrada apenas se ele for realmente um
Quando seu programa contm mais que uma declarao, as
nmero.
declaraes so executadas, previsivelmente, de cima para baixo.
Como um exemplo bsico, este programa tem duas declaraes. A
primeira pergunta ao usurio por um nmero, e a segunda, que
executada posteriormente, mostra o quadrado deste nmero:
var theNumber = Number(prompt("Pick a number", ""));
alert("Your number is the square root of " + theNumber * theNumber);
var theNumber = Number(prompt("Pick a number", ""));
if (!isNaN(theNumber))
alert("Your number is the square root of " +
theNumber * theNumber);
Com essa modificao, se voc fornecer "queijo" como argumento de
entrada, nenhuma sada ser retornada.
A palavra-chave if executa ou no uma declarao baseada no
resultado de uma expresso Booleana. Tal expresso escrita entre
parnteses logo aps a palavra-chave e seguida por uma declarao
a ser executada.
A
funo isNaN
retorna true apenas
uma
se
funo
o
padro
argumento
do
JavaScript
fornecido
que
for NaN.
funoNumber retorna NaN quando voc fornece a ela uma string que
no representa um nmero vlido. Por isso, a condio se traduz a
"a no ser que theNumber no seja um nmero, faa isso".
Voc frequentemente no ter cdigo que executa apenas quando
uma condio for verdadeira, mas tambm cdigo que lida com o
outro caso. Esse caminho alternativo representado pela segunda
seta no diagrama. A palavra-chave elsepode ser usada, juntamente
com if, para criar dois caminhos distintos de execuo.
var theNumber = Number(prompt("Pick a number", ""));
if (!isNaN(theNumber))
alert("Your number is the square root of " +
theNumber * theNumber);
else
alert("Hey. Why didn't you give me a number?");
Loops While e Do
Considere um programa que imprime todos os nmeros pares de 0 a
Se tivermos mais que dois caminhos a escolher, mltiplos pares
12. Uma forma de escrever isso :
de if/else podem ser "encadeados". Aqui temos um exemplo:
var num = Number(prompt("Pick a number", "0"));
if (num < 10)
alert("Small");
else if (num < 100)
alert("Medium");
else
alert("Large");
console.log(0);
console.log(2);
console.log(4);
console.log(6);
console.log(8);
console.log(10);
console.log(12);
Isso funciona, mas a ideia de escrever um programa fazer com que
O programa ir primeiramente verificar se num menor que 10. Se for,
algo seja menos trabalhoso, e no o contrrio. Se precisarmos de
ele escolhe esse caminho, mostra "Small" e termina sua execuo.
todos os nmeros pares menores do que 1.000, essa abordagem
Se no for, ele escolhe o caminho else, que contm o segundo if. Se
seria invivel. O que precisamos de uma maneira de repetir cdigo.
a segunda condio (< 100) for verdadeira, o nmero est entre 10 e
Essa forma de fluxo de controle chamada de lao de
100, e "Medium" ser mostrado. Caso contrrio, o segundo e
repetio (loop).
ltimo else ser escolhido.
O esquema de setas para este programa parece com algo assim:
O fluxo de controle do loop nos permite voltar a um mesmo ponto no
counter = counter + 1;
}
console.log(result);
// 1024
programa onde estvamos anteriormente e repet-lo no estado atual
do programa. Se combinarmos isso a uma varivel contadora,
O contador pode tambm iniciar com 1 e checar o valor com <=
conseguimos fazer algo assim:
mas por razes que iremos ver no Captulo 4 [TODO:] Adicionar link
correto com
var number = 0;
while (number <= 12) {
console.log(number);
number = number + 2;
}
// 0
// 2
//
etcetera
10,
ncora para a sesso mencionada no texto
original:http://eloquentjavascript.net/04_data.html#array_indexing [/T
ODO], uma boa ideia se acostumar a usar a contagem iniciando
com zero.
Uma declarao que inicia com a palavra-chave while cria um loop. A
O loop do uma estrutura de controle similar ao while. A nica
palavra while acompanhada por uma expresso entre parnteses e
diferena entre eles que o do sempre executa suas declaraes ao
seguida por uma declarao, similar ao
O loop continua
menos uma vez e inicia o teste para verificar se deve parar ou no
executando a declarao enquanto a expresso produzir um valor
apenas aps a primeira execuo. Para demonstrar isso, o teste
que, aps convertido para o tipo Booleano, seja true.
aparece aps o corpo do loop:
if.
Nesse loop, queremos imprimir o nmero atual e somar dois em
do {
var name = prompt("Who are you?");
} while (!name);
console.log(name);
nossa varivel. Sempre que precisarmos executar mltiplas
declaraes dentro de um loop, ns as envolvemos com chaves
Esse programa ir forar voc a informar um nome. Ele continuar
({ e }). As chaves, para declaraes, so similares aos parnteses
pedindo at que seja fornecido um valor que no seja uma string
para as expresses, agrupando e fazendo com que sejam tratadas
vazia. Aplicar o operador ! faz com que o valor seja convertido para
como uma nica declarao. Uma sequncia de declaraes
envolvidas por chaves chamada de bloco.
exceto "" convertem para true.
Muitos programadores JavaScript envolvem cada if e loop com
Indentando Cdigo
tipo
Booleano
antes
de
neg-lo,
todas
as
strings
chaves. Eles fazem isso tanto para manter a consistncia quanto para
evitar que seja necessrio adicionar ou remover chaves quando
Voc deve ter reparado nos espaos que coloco em algumas
houver alteraes posteriores no nmero de declaraes. Nesse
declaraes. No JavaScript, eles no so necessrios e o
livro, para sermos mais breves, iremos escrever sem chaves a
computador ir aceitar o programa sem eles. De fato, at as quebras
maioria das declaraes compostas por uma nica linha. Fique a
de linhas so opcionais. Se voc quiser, pode escrever um programa
vontade para escolher o estilo que preferir.
inteiro em uma nica linha. O papel da indentao dentro dos blocos
A varivel number demonstra uma maneira na qual variveis podem
fazer com que a estrutura do cdigo se destaque. Em cdigos
verificar o progresso de um programa. Toda vez que o loop se
complexos, onde temos blocos dentro de blocos, pode se tornar
repete, number incrementado por 2. No incio de cada repetio, ele
extremamente difcil distinguir onde um bloco comea e o outro
comparado com o nmero 12 para decidir se o programa terminou
termina. Com a indentao adequada, o formato visual do programa
de executar todo o trabalho esperado.
corresponde ao formato dos blocos contidos nele. Gosto de usar dois
Como um exemplo de algo que seja til, podemos escrever um
espaos para cada bloco, mas essa preferncia pode variar
programa que calcula e mostra o valor de 2 (2 elevado dcima
algumas pessoas usam quatro espaos e outras usam caracteres
potncia). Ns usamos duas variveis: uma para armazenar o
"tab".
resultado e outra para contar quantas vezes multiplicamos esse
Loops For
resultado por 2. O loop testa se a segunda varivel j atingiu o valor
10 e ento atualiza ambas as variveis.
Vrios loops seguem o padro visto nos exemplos anteriores do while.
var result = 1;
var counter = 0;
while (counter < 10) {
result = result * 2;
Primeiramente uma varivel "contadora" criada para monitorar o
progresso do loop. Em seguida, temos o loop while que contm uma
A construo do for nesse exemplo no contm a parte que checa
expresso de teste que normalmente checa se o contador alcanou
pelo fim do loop. Isso significa que o loop no vai parar de executar
algum limite. O contador atualizado no final do corpo do loop,
at que a declarao break contida nele seja executada.
permitindo acompanhar o progresso.
Se voc no incluir a declarao break ou acidentalmente escrever
Por esse padro ser muito comum, o JavaScript e linguagens
uma condio que sempre produza um resultado true, seu programa
similares fornecem uma forma um pouco mais curta e compreensiva
ficar preso em um loop infinito. Um programa preso em um loop
chamada de loop for.
infinito nunca vai terminar sua execuo, o que normalmente uma
for (var number = 0; number <= 12; number = number + 2)
console.log(number);
// 0
// 2
//
etcetera
coisa ruim.
Se voc criar um loop infinito em algum dos exemplos destas pginas,
Esse programa equivalente ao exemplo anterior que imprime
nmeros pares. A nica diferena que todas as declaraes
relacionadas ao "estado" do loop esto agora agrupadas.
voc normalmente ser perguntado se deseja interromper a
execuo do script aps alguns segundos. Se isso no funcionar,
voc dever fechar a aba que est trabalhando, ou em alguns casos,
fechar o navegador para recuper-lo.
Os parnteses aps a palavra-chave for devem conter dois pontos e
vrgulas. A parte anterior ao primeiro ponto e vrgulainicializa o loop,
normalmente definindo uma varivel. A segunda parte a expresso
que verifica se o loop deve continuar ou no. A parte final atualiza o
estado do loop aps cada iterao. Na maioria dos casos, essa
A palavra-chave continue similar ao break, de modo que tambm
influencia o progresso de um loop. Quando continue encontrado no
corpo de um loop, o controle de execuo pula para fora do corpo e
continua executando a prxima iterao do loop.
Atualizando variveis suscintamente
construo menor e mais clara que a do while.
Aqui est o cdigo que calcula 2 usando
for ao invs
var result = 1;
for (var counter = 0; counter < 10; counter = counter + 1)
result = result * 2;
console.log(result);
// 1024
de while:
Um programa, especialmente quando em loop, muita vezes precisa
de atualizar uma varivel para armazenar um valor baseado no valor
Repare que mesmo no abrindo o bloco com {, a declarao no loop
anterior dessa varivel.
continua indentada com dois espaos para deixar claro que ela
counter = counter + 1;
"pertence" linha anterior a ela.
O JavaScript fornece um atalho para isso:
Quebrando a execuo de um Loop
counter += 1;
Atalhos similares funcionam para outros operadores, como
Ter uma condio que produza um resultado
false
no a nica
maneira que um loop pode parar. Existe uma declarao especial
chamada break que tem o efeito de parar a execuo e sair do loop
para dobrar o result ou counter
-= 1
result *=
para diminuir um.
Isto nos permite encurtar nosso exemplo de contagem um pouco
mais:
em questo.
Esse programa ilustra o uso da declarao
break.
Ele encontra o
for (var number = 0; number <= 12; number += 2)
console.log(number);
primeiro nmero que , ao mesmo tempo, maior ou igual a 20 e
Para counter
divisvel por 7.
curtos: counter++ e counter--
for (var current = 20; ; current++) {
if (current % 7 == 0)
break;
}
console.log(current);
// 21
Usar o operador resto (%) uma maneira fcil de testar se um nmero
divisvel por outro. Se for, o resto da diviso entre eles zero.
+=
e counter
-=
1,
existem equivalentes mais
Resolvendo um valor com switch
comum que o cdigo fique assim:
if (variable == "value1") action1();
else if (variable == "value2") action2();
else if (variable == "value3") action3();
else defaultAction();
H um construtor chamado switch que se destina a resolver o envio
Em alguns casos, como a funo Number, a primeira letra da varivel
de valores de uma forma mais direta. Infelizmente, a sintaxe
capitalizada tambm. Isso feito para marcar a funo como um
JavaScript usada para isso (que foi herdada na mesma linha de
construtor. O que um construtor ser esclarecido no captulo 6. Por
linguagens de programao, C e Java) um pouco estranha -
enquanto, o importante no ser incomodado por esta aparente falta
frequentemente uma cadeia de declaraes
de consistncia.
if
continua parecendo
melhor. Aqui est um exemplo:
Comentrios
switch (prompt("What is the weather like?")) {
case "rainy":
console.log("Remember to bring an umbrella.");
break;
case "sunny":
console.log("Dress lightly.");
case "cloudy":
console.log("Go outside.");
break;
default:
console.log("Unknown weather type!");
break;
}
Frequentemente, o cdigo puro no transmite todas as informaes
necessrias que voc gostaria que tivessem para leitores humanos,
ou ele se transmite de uma forma to enigmtica que as pessoas
realmente no conseguem entend-lo. Em outras ocasies, voc est
Dentro do bloco aberto pelo switch, voc pode colocar qualquer
apenas se sentindo potico ou quer anotar alguns pensamentos
nmero de rtulo no case. O programa vai pular para o rtulo
como parte de seu programa. Os comentrios so para isto.
correspondente ao valor que switch fornece, ou para default se
nenhum valor for encontrado. Ento ele comea a executar as
declaraes, e continua a passar pelos rtulos, at encontrar uma
declarao break. Em alguns casos, como no exemplo case
"sunny",
pode ser usado para compartilhar algum cdigo entre os cases (ele
recomenda "ir l fora" para ambos os tempos
tenha cuidado: fcil esquecer de um
break,
sunny
e cloudy). Mas
o que far com que o
programa execute cdigo que voc no gostaria de executar.
O comentrio um pedao de texto que parte de um programa mas
completamente ignorado pelo computador. No JavaScript temos
duas maneiras de escrever os comentrios. Para escrever em uma
nica linha de comentrio, voc pode usar dois caracteres barra (
//
e ento o comentrio aps.
var accountBalance = calculateBalance(account);
// It's a green hollow where a river sings
accountBalance.adjust();
// Madly catching white tatters in the grass.
var report = new Report();
// Where the sun on the proud mountain rings:
addToReport(accountBalance, report);
// It's a little valley, foaming like light in a glass.
Capitalizao
Um //
comentrio
vai at o final da linha. Uma seo de texto
Nomes de variveis no podem conter espaos, no entanto muito
entre /* e */ ser ignorado, independentemente se ele contm
til usar mltiplas palavras para descrever claramente o qu a
quebras de linha. Isto geralmente til para adicionar blocos de
varivel representa. Estas so praticamente suas escolhas para
informao sobre um arquivo ou um pedao do programa.
escrever nomes de variveis com vrias palavras:
fuzzylittleturtle
fuzzy_little_turtle
FuzzyLittleTurtle
fuzzyLittleTurtle
O primeiro estilo difcil de ler. Pessoalmente, eu gosto de usar
/*
I first found this number scrawled on the back of one of
my notebooks a few years ago. Since then, it has
occasionally dropped by, showing up in phone numbers and
the serial numbers of products that I bought. It
obviously likes me, so I've decided to keep it.
*/
var theNumber = 11213;
Resumo
sublinhados, embora esse estilo seja um pouco doloroso de escrever.
O padro das funes em JavaScript, e o da maioria dos
programadores JavaScript, seguir o ltimo estilo - eles capitalizam
toda palavra exceto a primeira. No difcil se acostumar com coisas
Voc agora sabe que um programa construdo de declaraes, que
as vezes contm mais declaraes. Declaraes tendem a conter
expresses, que podem ser feitas de pequenas expresses.
pequenas assim, e o cdigo com estilos de nomenclaturas mistas
pode se tornar desagradvel para leitura, ento vamos seguir esta
Colocar declaraes uma aps a outra nos d um programa que
conveno.
executado de cima para baixo. Voc pode causar transtornos no fluxo
de controle usando declaraes condicionais (f, else e switch) e
loops (while, do e for).
As variveis podem ser usadas para arquivar pedaos de dados sob
Voc pode comear com um programa que simplesmente imprime os
um nome, e so teis para rastrear o estado de um programa. O
nmeros de 1 a 7, na qual voc pode derivar algumas modificaes
ambiente um conjunto de variveis que so definidas. O sistema
no exemplo de impresso de nmeros dado no incio do captulo aqui,
JavaScript sempre coloca um nmero padro de variveis teis
onde o loop foi introduzido.
dentro do seu ambiente.
Agora, considere a equivalncia entre nmeros e cadeias em
Funes so valores especiais que encapsulam um pedao do
um hash de caracteres. Voc pode ir de 1 para 2 adicionando 1 (+
programa. Voc pode invoc-las escrevendo function
Voc pode ir de "#" para "##", adicionando um caractere (+
argument2) {}.
Name (argument1,
Essa chamada de funo uma expresso, que pode
= 1).
= "#").
Assim, a soluo pode acompanhar de perto o nmero, de impresso
produzir um valor.
do programa.
Exerccios
FizzBuzz
Escreva um programa que imprima usando console.log() todos os
Se voc est inseguro sobre como testar suas solues para os
nmeros de 1 a 100 com duas excees. Para nmeros divisveis por
exerccios, consulte a introduo.
3, imprima Fizz ao invs do nmero, e para nmeros divisveis por 5
Cada exerccio comea com a descrio de um problema. Leia e
(e no 3), imprima Buzz.
tente resolv-lo. Se voc tiver dificuldades, considere a leitura das
Quando
dicas abaixo do exerccio. As solues completas para os exerccios
imprimir FizzBuzz para nmeros que so divisveis ambos por 3 e 5 (e
no esto inclusas neste livro, mas voc pode procurar elas onlines
continue imprimindo Fizz e Buzz para nmeros divisveis por apenas
em eloquentjavascript.net/code. Se voc quer aprender algo, eu
um deles).
recomendo que veja as solues somente aps ter resolvido o
(Isto na verdade uma pergunta de entrevista usada para eliminar
exerccio, ou pelo menos, depois que tentou por um perodo longo e
uma porcentagem significativa de candidatos programadores. Ento
duro o suficiente para dar uma pequena dor de cabea.
se voc resolv-la, voc est autorizado de se sentir bem consigo
Tringulo com Loop
mesmo).
Escreva um programa que faa sete chamadas a
console.log()
para
retornar o seguinte tringulo:
#
##
###
####
#####
######
#######
Uma maneira interessante para saber o comprimento de uma string
escrevendo .length aps ela.
var abc = "abc";
console.log(abc.length);
// 3
programa
estiver
funcionando,
modifique-o
para
Dica:
Interar sobre os nmeros trabalho claro de um loop, e selecionar o
que imprimir uma questo de execuo condicional. Lembre-se do
truque de usar o operador restante (%) para verificar se um nmero
divisvel por outro nmero (ter zero de resto).
Na primeira verso, existem trs resultados possveis para cada
nmero, ento voc ir criar uma cadeia de if/else
if/else.
Na segunda verso o programa tem uma soluo simples e uma
A maioria dos exerccios contm um pedao de cdigo que pode ser
utilizada para alterar e resolver o exerccio. Lembre-se que voc pode
clicar em um bloco de cdigo para edit-lo.
// Your code here.
Dicas:
inteligente. A maneira mais simples adicionar um outro "ramo" para
um teste preciso da condio dada. Para o mtodo inteligente
construir uma sequncia de caracteres contendo palavra ou palavras
para a sada, que imprima a palavra ou o nmero, caso no haja
palavra, fazendo o uso do operador elegante ||.
Tabuleiro de Xadrez
Escreva um programa que cria uma string que representa uma grade
8x8, usando novas linhas para separar os caracteres. A cada posio
da grade existe um espao ou um caracter "#". Esses caracteres
formam um tabuleiro de xadrez.
Passando esta string para o console.log deve mostrar algo como isto:
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
Quando voc tiver o programa que gere este padro, defina a
varivel size
e altere programa para que ele funcione para
qualquer size, a sada da grade de largura e altura.
// Your code here.
Dica:
A sequncia pode ser construda iniciando vazia ("") e repetidamente
adicionando caracateres. O caracter para uma nova linha escrito
assim \n.
Utilize console.log para visualizar a sada do seu programa.
Para trabalhar com duas dimenses, voc ir precisar de um loop
dentro de outro loop. Coloque entre chaves os "corpos" dos loops
para se tornar mais fcil de visualizar quando inicia e quando termina.
Tente recuar adequadamente esses "corpos". A ordem dos loops
deve seguir a ordem que usamos para construir a string (linha por
linha, esquerda para direita, cima para baixo). Ento o loop mais
externo manipula as linhas e o loop interno manipula os caracteres
por linha.
Voc vai precisar de duas variveis para acompanhar seu progresso.
Para saber se coloca um espao ou um "#" em uma determinada
posio, voc pode testar se a soma dos dois contadores ainda
divisvel por (% 2).
Encerrando uma linha com um caracter de nova linha acontece aps
a linha de cima ser construda, faa isso aps o loop interno, mas
dentro do loop externo.