Eric Douglas Esse livro est venda em http://leanpub.com/javascriptfurtivo Essa verso foi publicada em 2014-05-07 This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and many iterations to get reader feedback, pivot until you have the right book and build traction once you do. 2014 Eric Douglas Contedo Apresentao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Motivao para este trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Bom, se tenho o livro de graa, por que pagar? . . . . . . . . . . . . . . . . . . . . . . . . 2 Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Livros Modulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Mas o que eu, leitor, ganho com isso? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Depoimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Sobre a Capa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Foguete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Experimentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Terno e Gravata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Dvidas e Consideraes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Prefcio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Ol JavaScript! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 O que JavaScript? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Chega de conversa, vamos aprender Java!!! . . . . . . . . . . . . . . . . . . . . . . . . . . 15 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Conhecendo o Idioma JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 As Letras do Nosso Alfabeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 JavaScript no JAVASCRIPT nem javascript! . . . . . . . . . . . . . . . . . . . . . . . . . 18 Rodinhas, digo, Comentrios no Cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Como Escrever Meu Cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Sempre use Ponto e Vrgula ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Cartrio JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 O Valor dos Tipos de Operadores - Parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Tipos de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 CONTEDO Operadores e Operaes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Nmeros Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 O Valor dos Tipos de Operadores - Parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Valores Booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Valores Truthy e Falsy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Truques com o Operador ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Cuidado com a Falsidade! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Valores Undefined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Operadores Unrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Operadores de Incremento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Operadores de Comparao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Coero de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Como Evitar a Coero de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Curiosidades sobre os Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Operador Ternrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Regras de Precedncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Concluso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Expresses JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 O que uma Expresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Expresses Bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Expresses de Inicializao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Expresses de Definio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Expresses para Acessar Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Expresses de Invocao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Expresses de Criao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Mais Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Apresentao Neste livro iremos focar nos tpicos iniciais da linguagem JavaScript, sendo este um guia ideal para quem est iniciando no desenvolvimento web, e tambm para quem j possui algum conhecimento mas pretende estudar com base em algum material mais aprofundado e com vrios exerccios prticos, consolidando assim o que j sabe e aprendendo coisas novas. Aps cada etapa terica, irei apresentar exemplos e exerccios para fixao de todo o contedo, e aps uma parte significativa dos estudos, iremos criar projetos para total entendimento prtico de como aplicar essas informaes. Os exerccios e projetos sero resolvidos e contaro com uma detalhada explicao, para total entendimento por parte do leitor. Outro ponto importante que comprometo-me a ser o mais prtico possvel. Sim, teoria timo e nos d muita base, mas iremos ficar tambm bastante tempo no console testando e aplicando nossos cdigos. Para seu aprendizado ser consolidado, e a informao contida neste livro se transformar em seu conhecimento, extremamente necessrio que voc pratique todos os cdigos aqui presentes, e continue a leitura apenas quando tiver um entendimento mnimo do que eles esto fazendo. Em caso de dvidas sobre os temas apresentados, voc pode compartilh-las nos grupos JavaScript https://www.codeschool.com/courses/discover-devtools Apresentao 2 Brasil e impJS. Apenas no deixe dvidas acumularem. Irei tentar lhe ajudar da melhor maneira possvel! Alm disso, voc pode ficar por dentro das novidades do blog, novos livros/projetos e muito mais sobre o universo JavaScript assinando a minha newsletter. Prometo que s ter links e assuntos teis relacionados ao universo do JavaScript! Nada de spam! Motivao para este trabalho Tenho uma enorme satisfao em poder compartilhar conhecimento, e fao isso de forma mais empenhada ainda quando se trata de JavaScript! Sendo assim, para que este conhecimento no fique restrito apenas para quem pode pagar, mas esteja disponvel para todos que, de fato, queiram aprender, decidi criar este material e disponibiliz-lo de forma gratuita no meu blog. Realmente um prazer imenso poder fazer parte desta comunidade de desenvolvedores, e esse livro (e os prximos) sero uma pequena retribuio, um agradecimento a tudo o que j aprendi atravs dela. Bom, se tenho o livro de graa, por que pagar? fato que o trabalho de se escrever um livro consome muito tempo e exige uma grande dedicao. A compilao deste trabalho em formato de livro tem como objetivo experimentar uma nova forma de compartilhar conhecimento, onde irei presente-lo com o melhor contedo que me for possvel criar, e caso voc fique satisfeito com este, voc tambm poder me presentar com sua colaborao. Alm dessa forma de negociarmos atravs de presentes, estou iniciando uma metodologia prpria de diviso do contedo a ser ensinado de forma modular. Irei te explicar melhor isso no pximo captulo. Tendo este formato obtido xito, j tenho em mente outros temas para novas sries furtivas. Se voc est curioso em saber quais so estes possveis temas, irei lhe contar. Prximos Temas NodeJS Meteor Express https://www.facebook.com/groups/javascriptbrasil/ https://www.facebook.com/groups/impJS/ http://eepurl.com/TpAmv http://ericdouglas.github.io/2014/04/08/10-javascript-furtivo-apresentacao/ Apresentao 3 AngularJS MongoDB (e bancos de dados NoSQL) MEAN e tambm a combinao Jade e Stylus. Concluso O objetivo desta srie ser uma referncia de material de alta qualidade sobre JavaScript, levando o melhor do mundo terico e prtico para voc. Os grandes diferenciais so o contedo sintetizado e claro, levando o leitor direto aos pontos chaves da linguagem, e os diversos exerccios e projetos prticos resolvidos e comentados, que fecham o ciclo do conhecimento e domnio real dos assuntos abordados. A fortaleza ntima do homem a sua sinceridade de propsitos. Enquanto rvores colossais nenhum fruto produzem, outras pequenas rvores cobrem-se de belos pomos. Livros Modulares Continuando as inovaes na forma de se apresentar contedo tcnico, irei implementar um sistema onde o leitor poder montar o seu prprio livro, de acordo com sua vontade/necessidade. Como assim? Ainda no entendi! Simples! Os livros sero dividos por reas e paradigmas da linguagem. Este primeiro livro, JavaScript Furtivo, ir abordar a estrutura (sintaxe) bsica da linguagem e a parte lgica utilizada em suas expresses/instrues. Os prximos livros abordaro funes, objetos, arrays e demais assuntos especficos da linguagem, tendo cada um a devida profundidade no tema. Porm, para que voc no fique defasado em relao a estes outros assuntos, no final deste livro estar presente uma lista de recursos para voc continuar por conta prpria estudando estes temas, a nica diferena que a explicao dos mesmos ficar para futuras publicaes (que sairo em breve). Livros Modulares 5 Mas o que eu, leitor, ganho com isso? Liberdade!!! Acompanhe comigo a seguite situao: Imagine uma pessoa que j temexperincia comdesenvolvimento JavaScript, estudou seus princpios bsicos e tem um bom entendimento do paradigma orientado a objetos, mas tem muita vontade de aprender mais sobre programao funcional, e gostou do contedo apresentado nesta srie, atravs do meu blog, e gostaria de adquirir o livro para poder estudar atravs dos exerccios e projetos. Imaginou isso? Legal! Agora vamos continuar, se ele j sabe a maior parte e quer apenas aprofundar em funes, se o material for disponibilizado de forma nica, ele ter que pagar por todo o livro, porm, se o mesmo estiver modularizado (dividido), ele poder adquirir apenas a parte que lhe interessa. Justo! Ento, com essa viso que inicio essa nova maneira de dispor contedo, permitindo que o mesmo seja adquirido de forma independente. Outro ponto importante nessa abordagem que assim teremos mais liberdade para aprofundar em cada tema em especfico, elevando e muito nosso conhecimento e domino nos temas. Depoimentos Aqui voc pode encontrar algumas opinies dos leitores do blog sobre o contedo deste livro JavaScript Furtivo! Show a comunidade precisava de um projeto desses! Suissa Curti muito a iniciativa! Sucesso, cara! =D Leonardo Alberto Souza T cada dia melhor!!! Valdiney Frana Parabns cara perseverana. Osmar Cs Ta muito da hora Depoimentos 7 Luiz Henrique Muito Bom! Show! Falconiere Rodrigues Barbosa Perfect ! Jonathan Brunno Muito legal! Deise DallAgnol Muito bom! Robson Bittencourt Muito bom! Mrcio Carvalho timo! Bom saber que existem pessoas escrevendo artigos de JS em portugus Luis Fontes Muito bom artigo e bem explicado. Andr Luiz Boa Eric. Tenho acompanhado desde a primeira parte e est sendo bem proveitoso pra mim. Finalmente vou aprender JS, xD. Euclides Fernandes Muito bom! Raphael Fabeni Estava realmente precisando, bem legal os artigos. parabns! Jefferson Daniel Show de bola hein! Flvio Depoimentos 8 Post muito bom Eric parabns cara!! Rafael Antonio Lucio Parabns Eric! gustavoSRodrigues Muito bom! parabns mesmo Xar rs Erick Isso ai Eric! Episdios de alta qualidade parabns pelo timo trabalho!! Guilherme Decampo Sou f desse Eric Palmer Muito obrigado. Como sempre, excelentes contedos. Abrao. Denis Toledo Nice post man! +1 Caio Ribeiro Pereira Sobre a Capa A capa do nosso livro no foi criada apenas com fins estticos, mas tem ali representada a sntese de todo o trabalho e ideologia que ser encontrado neste livro e no projeto em si. Foguete Foguete Voc sabia que um foguete consome mais de 80% do seu combustvel apenas para ser lanado? Sobre a Capa 10 Exatamente, um gasto absurdo de energia apenas para tir-lo do cho Mas no sobre foguetes que quero falar aqui, mas sim sobre dedicao e, principalmente hbito. Criar um (bom) hbito pode ser perfeitamente comparado com o lanamento de um foguete. No incio, temos que lutar, nos esforar muito para conseguir apenas sair do cho, mas depois que conseguimos superar essa barreira inicial, o vo se d de forma fluida. Antes de tentar aprender sobre qualquer coisa, tenha em mente a certeza que voc s conseguir obter bons resultados se voc cultivar bons hbitos relacionados a tal tarefa. Cultive bons hbitos!, e elimine os maus Experimentos Experimentos Nosso livro estar recheado de exemplos, exerccios e projetos. Usaremos os exemplos para explicar trechos curtos da teoria, atravs de pequenos cdigos que tem o papel de deixar visual e mais palpvel este primeiro contato com um determinado assunto. Os exerccios estaro contidos no fim dos captulos, e tem o objetivo de verificar se voc realmente aprendeu os assuntos em questo. Vale ressaltar que alm dos exerccios, no fim do livro estaro todas as resolues dos mesmos, para auxili-lo quando necessrio, e tambm a explicao detalhada de como o exerccio foi resolvido. ps: Olhe a resoluo somente aps tentar resolver os exerccios por vrias vezes, pois isso essencial para seu aprendizado. O importante no voc resolver exerccio X ou Y, mas sim entender o que est acontecendo ali. Os projetos sero o ponto mximo dos nossos estudos, onde iremos juntar o contedo de alguns captulos para criar aplicaes reais, tendo com elas uma experincia prtica de um verdadeiro desenvolvedor JavaScript! Sobre a Capa 11 Importante! No irei passar nenhum exerccio/projeto que exija mais do que tenha sido explicado, pode confiar! Os exerccios sero exatamente do mesmo nvel do que j tenha sido ensinado. Eventuais dvidas estaro ligadas mais emrelao lgica empregada, e isso algo muito pessoal pois cada umvisualiza o problema de uma forma. No entanto, no se preocupe com acertar ou no. Se esforce para resolver o problema, pois caso no consiga obter xito inicial em algum problema, quando voc verificar a resposta, essa ser muito melhor aproveitada e absorvida do que se voc tivesse a visto sem esforo prvio. Terno e Gravata Terno e gravata Essa ilustrao, por fim, tem o objetivo de nos dizer que, ao trmino destes estudos, estaremos aptos a ser considerados verdadeiros desenvolvedores JavaScript com um slido conhecimento da linguagem, e prontos para atuar e contribuir no somente com a comunidade de desenvolvedores, mas com o mundo todo, criando aplicaes de alto nvel, e implementando ferramentas que iro nos ajudar no nosso dia a dia! Dvidas e Consideraes Caso voc tenha alguma dvida ou considerao a fazer sobre o material aqui apresentado, alm dos locais mensionados no captulo Apresentao, voc tambm poder utilizar este grupo para se comunicar comigo e com os demais leitores do livro. https://groups.google.com/forum/#!forum/javascript-furtivo Prefcio Agora que voc est ciente de como ir funcionar essa nova proposta de compartilhamento de contedo, podemos iniciar nossa jornada rumo maestria no JavaScript. Neste livro voc ir aprender toda a estrutura (sintaxe) bsica da linguagem e sua estrutura lgica. Irei te mostrar como nomear suas variveis, como criar dados, como usar os operadores que a linguagem nos fornece para criar programas de lgica, e no ltimo captulo ser introduzido um tpico avanado com dicas de otimizao para estes processos. Fazendo uma comparao com a nossa linguagem falada, iremos aprender como criar palavras, frases e textos simples, mas de forma eficaz, construindo uma base slida para o aprofundamento nos temas futuros. Alm disso, para cada captulo do livro voc ter uma lista de exerccios correspondente, e tambm a resoluo detalhada de cada exerccio, com explicaes minunciosas, passo a passo, para que voc possa entender verdadeiramente TUDO que est sendo feito. E para fechar nosso ciclo de aprendizagem, teremos um projeto que ir englobar todos os assuntos abordados no livro, para consolidar nosso conhecimento. Tenha uma tima leitura! Vamos comear =) Ol JavaScript! Antes de iniciarmos as apresentaes, vou lhe contar algo que voc dever tomar cuidado ao compartilhar, pois pode lhe gerar algumas discusses, mas o fato que o mercado nunca foi to interessante e animador para um programador JavaScript como agora, e nunca foi to onipresente para qualquer linguagem como est sendo para o JavaScript! Srio, hoje podemos fazer maravilhas com o JavaScript, desde programao front-end (no lado do cliente [navegador]), como no back-end com o espetacular Node.JS, que alm disso permitiu que o JavaScript fosse utilizado em diversas outras reas alm dos navegadores e mundo web. O trio HTML, CSS e JavaScript est cada vez mais presente nos celulares, seja como aplicaes hbridas ou at mesmo como o prprio sistema operacional, tendo como exemplo o Firefox OS. Para mais motivao para aprender JavaScript, veja este link. http://ericdouglas.github.io/2014/02/17/01-bushido-dev-web/ Ol JavaScript! 15 O que JavaScript? Vamos fazer uma analogia de uma aplicao web, seja um simples site ou um complexo sistema, com uma casa. Na casa, toda a parte estrutural (tijolos, telhado) equivalente ao HTML. Ele responsvel por estruturar e definir, semanticamente, quais elementos estaro presentes no nosso documento (outro nome para nossa pgina HTML). muito importante ter em mente exatamente o que cada tecnologia nos oferece, para aproveitarmos o melhor de cada, e no delegar tarefas de uma para a outra. O CSS responsvel de fazer o acabamento da casa, digo, da aplicao. a parte que devemos estilizar todo o documento, para que o mesmo no fique com cara de apenas um documento para impresso, mas sim com a cara de uma aplicao/programa o mais agradvel e utilizvel possvel. OBS: Tanto verdade sobre a questo do HTML ser um documento, que sua origem foi justamente essa. A WWW (World Wide Web) foi criada com fim de auxiliar pesquisadores a mandarem seus trabalhos acadmicos uns para os outros. O HTML (HyperText Markup** Language, ou linguagem de marcao de hipertexto) foi a linguagem criada para identificao do navegador de onde se teria um ttulo, um pargrafo, uma citao, e por ai vai O que vemos hoje com o HTML5 um sonho utpico, analisando o cenrio atual com a mentalidade de quando esta tecnologia (HTML) fora criada. Por ltimo, e no menos importante, temos o JavaScript! Em relao a uma casa, a funo do JavaScript seria dar vida a casa, ou seja, seria a luz e a gua da mesma, por exemplo. De forma menos ldica, de fato o JavaScript cuida das interaes da pgina com o usurio, e vice-versa. A funo primria para qual o JavaScript foi criada era a de tratar informaes do lado do cliente, sem que fosse necessrio o envio de informaes para processamento no servidor. Vale mais uma vez ressaltar a importncia da base histrica para real compreenso e valorizao das tecnologias, ferramentas que nos auxiliam a realizar determinada tarefa. Hoje em dia, o acesso a internet se faz em grande parte utilizando servios de banda larga. Bom, atualmente assim! No incio da nossa querida web, voc poderia levar tranquilamente 1 minuto apenas para receber uma mensagem que seu formulrio foi preenchido incorretamente Isso s o comeo, teremos uma longa caminhada para desvendar os segredos dessa linguagem fantstica que nos permite criar diversas coisas, tantas quanto nossa imaginao permitir! Chega de conversa, vamos aprender Java!!! Meu amigo, de corao, nunca diga Java referindo-se nossa querida linguagemJavaScript. Nunca!!! Este nome, infelizmente, foi uma terrvel escolha de marketing feita no incio da histria do JavaScript. Como a linguagem Java estava muito em alta na poca em que o JavaScript foi criado, resolveram nomear a linguagem de tal forma. Essa a maior semelhana que Java e JavaScript tem. Ol JavaScript! 16 JavaScript Nossa linguagem foi criada por Brendan Eich em 1995 quando o mesmo trabalhava na Netscape (hoje Mozilla). J teve o nome de Mocha e LiveScript, porm quando foi apresentada a implementao de Java nos navegadores da Netscape em conjunto com a Sun Microsystems (hoje Oracle), teve seu nome alterado para JavaScript. Este nome, JavaScript, marca registrada da Oracle atualmente. Quando o JavaScript foi padronizado pelo grupo ECMA (European Computer Manufacters Associ- ation), recebeu o nome de ECMAScript, e temos ento essa verso padronizada implementada nos navegadores. J na ECMAScript temos que ter ateno atualmente a trs de suas verses. A primeira a verso 3 (ECMAScript 3), que completamente suportada por todos os navegadores atuais. A segunda verso a 5 (ECMAScript 5) que est em grande parte implementada, mas iremos analisar quando alguma feature (propriedade, recurso) da mesma no for comum entre os navegadores. A verso 5 a que iremos abordar principalmente nessa srie. E a prxima verso a 6 (ECMAScript 6), que dever ser lanada em breve. Preocupe-se hoje com a 3 e 5, a 6 bom, no presente momento, apenas ter conhecimento de que est para chegar. =) Mais sobre o incio da JavaScript aqui; http://pt.wikipedia.org/wiki/JavaScript Conhecendo o Idioma JavaScript Para voc comear estudar a linguagem de programao JavaScript, necessrio que tenha o entendimento de como se d esse intercmbio dos caracteres que inserimos com a forma que os mesmos so interpretados pelo computador. Muito difcil? Vamos simplificar! algo bem simples, voc se comunica com outras pessoas atravs de uma linguagem, a qual nada mais que uma padronizao de sequncias de letras e fonemas que juntos referem-se a alguma coisa e do sentido a tal. Na rea da programao exatamente a mesma coisa! Temos que conhecer as estruturas bsicas da linguagem para comearmos a montar palavras, frases e textos, que no nosso caso sero os programas. Essa estrutura de comunicao bsica, ou estrutura lxica, nos indica como a linguagem deve ser escrita, sendo essa estrutura o nvel mais baixo de abstrao, nos indicando como criar e nomear variveis, como inserir comentrios nos cdigos e como escrever as expresses e instrues que faro toda a mgica acontecer. Agora que j temos em mente o que precisamos aprender, vamos, ento, aprender! Nesse captulo voc ir aprender: 1. Qual o padro de escrita usado no JavaScript; 2. Detalhes de nomenclatura; Conhecendo o Idioma JavaScript 18 3. Como inserir comentrios 4. Como nomear variveis; 5. O que so identificadores e palavras-reservadas. Leia sempre com bastante ateno cada tema passado e reflita-o um pouco para iniciar a absoro das informaes. Todo o contedo deste livro de suma importncia para seu aprendizado e crescimento como desenvolvedor JavaScript, porm, no pense que voc ter que aprender tudo na primeira vez que ler e/ou praticar. O aprendizado algo que leva tempo e muito esforo repetitivo, e muitas coisas no so triviais, e isso que no final far toda a diferena e dar a sua satisfao em ter vencido cada etapa do processo. =) As Letras do Nosso Alfabeto Nosso cdigo JavaScript escrito com base no padro Unicode, que podemos sucintamente definir como um padro que permite aos computadores representar e manipular, de forma consistente, texto de qualquer sistema de escrita existente. Este composto com mais de 107 mil caracteres! JavaScript no JAVASCRIPT nem javascript! A linguagem JavaScript faz diferenciao de letras maisculas de letras minsculas, portanto, todo o devido cuidado deve ser tomado para evitar discordncias na chamada de funes e todas as propriedades prprias do JavaScript e outras implementadas por voc. 1 var agora = 'teste minsculo'; 2 3 console.log( Agora ); // -> ReferenceError: Agora is not defined 4 console.log( agora ); // -> 'teste minsculo' Nesse cdigo acima, quando testado no Devtools do Chrome, por exemplo, ter como resultado os valores na frente da seta ->. Veremos como comentar nosso cdigo agora. Conhecendo o Idioma JavaScript 19 Rodinhas, digo, Comentrios no Cdigo Existe uma grande discusso de at que ponto interessante um cdigo muito comentado. Uns defendem dizendo que tal prtica ajuda a esclarecer o que est ali feito, ajudando no futuro quando voc revisitar tal seo, mas por outro lado, o lado prtico, vemos que muito comentrio simplesmente quebra o fluxo de leitura do cdigo, fazendo com que voc tenha que ficar saltando entre todos os textos, ou tendo que ler centenas/milhares de linhas a mais do que o necessrio. Sem contar que quando o cdigo atualizado, o comentrio tambm deve ser, e um comentrio desatualizado infinitas vezes pior do que a falta do mesmo. Pense comigo, o que estamos fazendo j no escrever em uma linguagem? Tudo bem, eu sei que a mesma diferente da nossa linguagem usada para comunicao interpessoal, porm, ela por si s deve ser auto-explicvel. Como conseguir isso? Nomeando suas funes de forma inteligente por exemplo, definindo no nome exatamente o que ela faz. E ai vem outra dica, cdigo modular vital para o sucesso de um programa. E para ter algo modular, esse algo deve fazer uma, e apenas uma tarefa. Conseguindo deixar um pedao isolado de cdigo fazendo apenas uma coisa, ser mais fcil nomear essa coisa, fazendo com que o nome j se auto-explique. Outra forma criar uma documentao para seu cdigo separado do mesmo, para evetuais consultas. Isso algo bem elegante, diga-se de passagem. Voc vai me dizer: Cara, voc no acha que est pegando pesado demais no?! Nem me mostrou cdigo e j est me mandando modularizar?! Ai meu amigo que a parte boa! Sendo modular, voc ter que fazer menos coisas! E assim ir ficar mais fcil desde o incio da sua vida de programador =) muito importante comear a trabalhar as ideias na sua cabea antes de serem implemen- tadas. O conceito to importante quanto a prtica, para quem quer realmente dominar o que est fazendo. E precisamos primeiro tentar criar algo, e depois de vrias tentativas e erros, iremos conseguir fazer tal coisa da forma mais correta. Voltando para os comentrios, as duas formas que temos de inseri-los nos nossos cdigos so: Usando duas barras: // Usando /* */ Vamos ver um exemplo: Conhecendo o Idioma JavaScript 20 1 /* Essa parte do meu cdigo comentada 2 e com esse sinal eu posso fazer comentrios 3 em vrias linhas... 4 */ 5 var valorX = 13; 6 7 // Com esse smbolo, o comentrio fica restrito a esta linha O termo do ttulo dessa seo, rodinhas, se refere s rodinhas quando estamos aprendendo a andar de bicicleta. No incio, so super importantes, mas depois que aprendemos a andar, no precisamos mais delas. Usaremos comentrios nos nossos cdigos para fins didticos, mas os mesmos devem ser usados de forma muito escassa, pois de fato no so necessrios. Se voc precisa explicar muito detalhadamente alguma parte do seu cdigo, porque algo ali no est muito correto Provrbio Chins Como Escrever Meu Cdigo Ao longo do livro, voc ir aprender de forma prtica as melhores prticas de escrita de cdigo, mas inicialmente voc apenas precisa saber que seu cdigo JavaScript pode conter qualquer quantidade de espaos em branco entre os sinais delimitadores do programa e, por conseguinte, tambm ignora quebra de linhas. 1 // cdigo vlido 2 var vazio = 'muito espao vazio aqui' ; Tome cuidado com as quebras de linhas, pois como veremos no fim deste captulo, em determinadas situaes, o seu cdigo pode ter um ponto e vrgula (;) adicionado pela prpria linguagem, para preveno de erros, porm que de fato ir gerar outros inesperados (mas que agora so esperados pois eu te falei que vo acontecer =P). Para que isso no acontea, tome cuidado com as quebras de linhas e com a omisso do ponto e vrgula. Por favor, seja caprichoso com seu cdigo, no porque voc pode fazer algo que voc deve fazer. Conhecendo o Idioma JavaScript 21 Sempre use Ponto e Vrgula ; Ao final de suas instrues, voc tem a possibilidade de omitir o ponto e vrgula (;), smbolo esse que mostra que uma instruo terminou. O problema que, como falado anteriormente, isso pode gerar vrios erros (in)esperados. Mas fica a seu critrio, pra que facilitar se podemos complicar, n?! Cartrio JavaScript Sim, aqui iremos falar da parte mais pesada desse captulo, que foi bem leve, ento de fato essa a parte menos leve. Qual parte essa? Na verdade so duas: identificadores e palavras reservadas. Identificadores Um identificador nada mais do que um nome que usamos para chamar nossas variveis e funes. Sim, iremos registrar o seu nome na certido, ou no programa como queira, para que futuramente quando esses meninos e meninas crescerem ainda nos lembremos deles e eles de ns. Temos apenas algumas restries para criar nossos identificadores, que so elas: Um identificador deve comear com alguma letra, $ ou _ (underscore); Nmeros s so permitidos aps o primeiro caractere estar de acordo com a regra anterior. Exemplos de nomes vlidos: carro, _teste, v8, $nomeValido. Palavras Reservadas Essas palavras so as que j esto definidas na linguagem, portanto apenas as usaremos. Confira abaixo algumas destas palavras: 1 break 2 case catch continue 3 debugger default delete do 4 else 5 finally for function 6 if in instanceof 7 new 8 return 9 switch 10 this throw try typeof 11 var void 12 while with Conhecendo o Idioma JavaScript 22 Na ECMAScript 5 temos mais palavras reservadas para uso futuro em novas implementaes do padro, que so: 1 class 2 enum export extends 3 import 4 super No strict mode (modo estrito da linguagem, veremos futuramente do que se trata), temos mais algumas palavras reservadas para futuras implementaes 1 implements interface 2 let 3 package private protected public 4 static 5 yield Veja mais sobre palavras reservadas aqui. Concluso Neste captulo ns aprendemos: que JavaScript usa o padro Unicode para seus caracteres; que JavaScript diferencia letras maisculas de minsculas; maneiras de comentar, e por que evitar comentar; que devemos sempre usar ponto e vrgula (;); como criar identificadores e como usar os existentes (palavras reservadas). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words O Valor dos Tipos de Operadores - Parte 1 O ttulo deste captulo uma representao dos trs assuntos que iremos aprender: Valores, Tipos e Operadores. Na primeira parte, iremos ver sobre: 1. Tipos de Dados 2. Tipo Number 3. Operadores Matemticos 4. Nmeros Especiais 5. Strings Tipos de Dados O que fazemos programando computadores basicamente manipular dados. No JavaScript, chama- mos esses dados de valores. Estes valores so divididos em dois tipos: O Valor dos Tipos de Operadores - Parte 1 24 Tipos Primitivos number (nmeros) string (sequncia de caracteres/texto) boolean (booleanos ou valores de verdade) Tipos Especiais: null (nulo) e undefined (indefinido) Todos os valores em JavaScript diferentes dos citados acima, so pertencentes ao tipo object (objeto). Vejamos quais so eles: Tipos de Objetos arrays (vetores) funes Date (data) RegExp (expresses regulares) Error Bom, agora que vimos teoricamente os tipos de dados em JavaScript, vamos perceber tudo isso de forma real. Para isso, voc dever abrir o console do seu navegador (no Google Chrome voc pode usar o atalho ctrl shift j. Dentro da seo console existente nas ferramentas do desenvolvedor, voc dever digitar os comandos abaixo, para perceber que tudo isso que te falei ali em cima verdade. O resultado esperado est indicado na frente da seta ->. Caso o resultado no seja o que voc conseguiu, certifique-se de ter digitado corretamente o cdigo. Ah, j ia me esquecendoDigite TODO o cdigo, no copie apenas!!! Isso ser muito importante para a memorizao e internalizao dos conceitos. ps: No acredite em meus resultados, faa todos os testes! =) Quando estamos dentro do console, a utilizao do comando console.log() desneces- sria para visualizar o resultado de uma instruo, pois o resultado da operao sempre retornado. Vamos utilizar o console diretamente apenas para cdigos curtos, pois para cdigos maiores, iremos rod-los atravs de nossa pgina html, e ai o comando console.log() ser de grande utilidade. O Valor dos Tipos de Operadores - Parte 1 25 1 /* verificao de tipos primitivos */ 2 typeof 13 // tipo number 3 // -> "number" 4 typeof "javascript furtivo" // tipo string 5 // -> "string" 6 typeof true // tipo boolean 7 // -> "boolean" 8 9 /* tipos primitivos especiais */ 10 var semValor = null; // tipo null 11 typeof semValor 12 // -> "object" 13 14 var semAtribuir; // tipo undefined 15 typeof semAtribuir 16 // -> "undefined" Olhando o cdigo acima, mais precisamente na parte de tipos primitivos especiais, voc pode perceber que o tipo null na verdade um object. Bom, mas por que isso? Essa peculiaridade do JavaScript na verdade um erro dos primridios da linguagem que foi herdado pela ECMAScript. Teremos um tpico especfico mais a frente para explicar essa questo. Vamos ver agora no nosso console os tipos existentes de objetos. 1 /* Tipos de Objeto */ 2 3 // objeto do tipo array (vetor) 4 var guitarras = [ 'ibanez', 'music man', 'suhr' ]; 5 typeof guitarras; // -> "object" 6 7 // objeto do tipo function 8 var soma = function( valor1, valor2 ) { return valor1 + valor2; } 9 typeof soma; // -> "function" 10 11 // objeto do tipo Date 12 var agora = new Date(); 13 typeof agora; // -> "object" 14 15 // objeto do tipo RegExp 16 var minhaRegExp = /padrao/; 17 typeof minhaRegExp; // -> "object" 18 O Valor dos Tipos de Operadores - Parte 1 26 19 // objeto do tipo Error 20 var perigo = new Error( 'Alguma coisa deu errado!' ); 21 typeof perigo; // -> "object" Muito bom! Agora j conhecemos todos os tipos de dados do JavaScript! Voc pode parar um pouco para respirar e beber uma gua, pois a partir de agora iremos aprofundar um pouco em cada tipo primitivo de dados que acabamos de ver. Os tipos de objetos so mais complexos, e por isso cada um ter um livro prprio (no mnimo) Number Representamos nmeros no JavaScript da mesma forma que escrevemos no nosso dia a dia. var numero = 13 a forma que dizemos no JavaScript que a varivel numero receceu o valor 13. Nmeros fracionrios so representados com um ponto, ficando assim a representao: var numero = 1.3. Quando tivermos trabalhando com um nmero muito grande ou muito pequeno, usamos notao cientfica atravs da letra e, ficando nosso cdigo, no caso, assim: 1.313e13 que igual a 1.313 x 10. Clculos com nmeros inteiros menores que 9 quadrilhes so garantidos de sempre serem precisos, porm no se pode dizer o mesmo para nmeros fracionrios, que devem ser tratados como aproximaes. Operadores e Operaes Agora que conhecemos um pouco mais sobre os nmeros no JavaScript, vamos aprender a utilizar alguns operadores para ento fazer alguns clculos com estes nmeros. Temos os 4 operadores matemticos bsicos representados no JavaScript da seguinte forma: +: efetua a adio de dois nmeros (ou concatenao, no caso de strings); -: efetua a subtrao de dois nmeros; *: efetua a multiplicao de dois nmeros; /: efetua a diviso de dois nmeros; %: efetua a diviso entre dois nmeros, e retorna o resto da diviso. Agora que j conhecemos os nmeros e operadores, vamos brincar um pouco no console. Digite as operaes abaixo e confira se o resultado o mesmo do indicado no comentrio. O Valor dos Tipos de Operadores - Parte 1 27 1 1.3 + 1.8 // -> 3.1 2 3 1.3 - 1.17 // -> 0.13000000000000012 4 5 1.3 * 10 // -> 13 6 7 13 / 2 // -> 6.5 8 9 13 % 2 // -> 1 Nmeros Especiais Temos trs tipos de nmeros que no se comportam como nmeros. Infinity, -Infinity e NaN. Os dois primeiros so gerados quando tentamos dividir algum nmero por zero, e o outro, Not a Number (NaN), surge quando h uma coero de tipo de string para number, no caso, mal sucedida, pois a string no pode ser convertida em um nmero de fato. Vamos ver como surgem estes nmeros! De volta ao console! =) 1 // criando um nmero atravs do objeto Number 2 var test = Number( 'treze' ); 3 test // -> NaN 4 typeof test // -> "number" 5 6 13 / 0 // -> Infinity 7 8 -13 / 0 // -> -Infinity ps: Uma particularidade do NaN que ele o nico valor em JavaScript que no igual a ele mesmo. Como verificar isso? A melhor forma para saber se uma varivel est com valor NaN testando se ela igual a ela mesmo (ou diferente). Se voc comparar a varivel A com ela mesmo e o resultado for false, logo, A igual a NaN. Vamos dar uma olhada mais de perto: 1 var A = NaN; 2 3 A == A; // -> false 4 A != A; // -> true Voc poderia tambm verificar se uma varivel est com o valor NaN usando o mtodo isNaN(), porm o mesmo apresenta alguns comportamentos inesperados por fazer coero dos valores para o tipo number. Veja mais aqui. https://gist.github.com/kitcambridge/1086528 O Valor dos Tipos de Operadores - Parte 1 28 Strings Este o tipo de dados bsico usado para representao de texto. Para o programa identificar uma string, tal deve estar contida entre aspas duplas ou simples, assim: "isso uma string" e 'isso tambm uma string' ps: Geralmente, usamos aspas simples no JavaScript e aspas duplas no HTML. Voc pode colocar tudo dentro de uma string, mas alguns caracteres precisam ser colocados com uma certa ateno, como aspas, quebras de linha, tabulao entre outros, e toda a string deve ser escrita como uma simples expresso, apesar de poder ser escrita em vrias linhas de cdigo, como ser demonstrado logo mais. Para fazer o escape dos caracteres especiais, utilizamos o smbolo da barra invertida \. Esse sinal nos diz que temos algum caractere com significado especial na frase. Vamos praticar um pouco essa teoria das cordas. 1 var 2 frase01 = 'Este o pargrafo inicial...', 3 frase02 = "... complementado por este trecho.", 4 frase03 = '\nA partir daqui comea a ficar interessante...', 5 frase04 = '\tagora com tabulao, e \'aspas\' tambm', 6 texto = frase01 + frase02 + frase03 + frase04; 7 8 texto; 9 /* 10 -> "Este o pargrafo inicial...... complementado por este trecho. 11 A partir daqui comea a ficar interessante... agora com tabulao, e 'aspas' tamb\ 12 m" 13 */ 14 15 // Para escrever o mesmo texto acima como 16 // uma sentena nica, faramos assim: 17 var texto2 = 'Este o pargrafo inicial...\ 18 ... complementado por este trecho.\ 19 \nA partir daqui comea a ficar interessante...\ 20 \tagora com tabulao, e \'aspas\' tambm'; 21 22 texto2; O Valor dos Tipos de Operadores - Parte 1 29 ps:O caracter \ quando colocado no fim da linha, permite que voc continue a string de outra linha. Isso til para formatao do cdigo, melhorando a sua legibilidade. Use a forma que for mais conveniente e agradvel para voc. Vamos encerrar esta primeira etapa por aqui, para que no fique muita informao de uma s vez. No prximo captulo iremos ver mais sobre operadores, booleanos, coero de tipo e mais algumas coisas. O Valor dos Tipos de Operadores - Parte 2 Continuando o ltimo captulo onde falavamos sobre valores, tipos e operadores, veja o que ser visto neste captulo logo abaixo: 1. Valores Booleanos 2. Valores Truthy e Falsy 3. Truques com o Operador ! 4. Cuidado com a Falsidade! 5. Valores undefined 6. Operadores Unrios 7. Operadores de Incremento 8. Operadores de Comparao 9. Coero (ou converso) de Tipo 10. Como Evitar a Coero de Tipo 11. Operadores Lgicos 12. Curiosidades sobre os Operadores Lgicos 13. Operador Ternrio 14. Regras de Precedncia O Valor dos Tipos de Operadores - Parte 2 31 Valores Booleanos Esse tipo de dado, boolean, bem especfico, tendo apenas dois valores possveis, true ou false (verdadeiro ou falso). Conseguimos obter estes valores atravs de operaes de comparao (x maior que y ? A resposta sempre sim ou no, verdadeiro ou falso no caso) e atravs de um truque utilizando o operador unrio ! (mais sobre operadores unrios e comparaes adiante). Este operador ! (negao) inverte o valor passado ele para um valor booleano oposto ao original. Vou explicar melhor, acompanhe comigo: Quando aplicamos o operador ! uma varivel que tenha realmente um valor considervel, obtemos o valor false como retorno desta operao. Mas para ficar mais claro o que um valor considervel, vou te explicar o que um valor descartvel. Valores Truthy e Falsy Agora voc j precisa ter os conceitos de valor, tipo e operador em JavaScript bem consolidados. Faa um exerccio mental de definir para voc mesmo o que cada um . Todos os tipos de valores em JavaScript tm, intrnsicamente (em sua essncia), um respectivo valor booleano associado. Estes valores so claramente perceptveis quando fazemos comparaes entre valores e quando utilizamos o operador unrio de negao !. Valores falsy (falsos) so os que tem em sua essncia o valor booleano false. Estes valores so: false 0 (zero) "" (string vazia) null undefined NaN Todos os outros valores em JavaScript so considerados truthy (verdadeiros). Alguns valores truthy peculiares so: "0" (zero como string) "false" (false como string) function() {} (funes vazias) [] (arrays vazios) {} (objetos vazios) O Valor dos Tipos de Operadores - Parte 2 32 Truques com o Operador ! Agora que sabemos exatamente quais valores booleanos cada valor do JavaScript carrega, podemos tranquilamente e conscientemente utilizar o operador ! para obter o valor contrrio do natural do valor em operao. Vamos aos exemplos, e portanto, ao console!: 1 !false // -> true 2 !0 // -> true 3 !"" // -> true 4 !NaN // -> true 5 !"0" // -> false 6 !"false" // -> false 7 !function() {} // -> false 8 !{} // -> false Um modo interessante de saber qual o valor truthy ou falsy de um valor negando-o duas vezes com o operador !. Sim, como na Matemtica, -1 x -1 = 1. Ento temos que: 1 !!false // -> false 2 !!NaN // -> false 3 !!{} // -> true 4 !!function() {} // -> true Cuidado com a Falsidade! Iremos ver ainda neste captulo como comparar valores atravs dos operadores de comparao, mas importantssimo que eu lhe explique mais uma ltima coisa sobre os valores falsy. As regras de comparao entre estes valores um pouco no-intuitiva, logo ter o conhecimento dos valores esperados em determinados casos crucial na hora de um eventual bug. Vamos ver quais so essas peculiaridades. false, 0 e "" Quando comparamos dois destes trs valores utilizando o operador ==, o resultado sempre true. Vamos testar no console o cdigo abaixo: OBS: Quando utilizamos o console, podemos omitir o sinal ; (ponto e vrgula) no fim das expresses, pois estamos fazendo apenas um teste rpido, porm no seu cdigo JavaScript de fato, sempre utilize o ponto e vrgula!!! O Valor dos Tipos de Operadores - Parte 2 33 1 false == 0 // -> true 2 false == "" // -> true 3 0 == "" // -> true null e undefined Os valores null e undefined somente so equivalentes a eles mesmos. Vejamos: 1 null == false // -> false 2 null == null // -> true 3 undefined == false // -> false 4 undefined == undefined // -> true 5 undefined == null // -> true O ltimo valor falsy que temos para citar o NaN, porm este j foi abordado no captulo anterior, e sabemos que o nico tipo de dado em JavaScript que no igual a ele mesmo. Valores Undefined Temos definidos no JavaScript dois tipos indefinidos, usados para representar a falta de representa- tividade de algum dado. ps: O paradoxo da frase anterior apenas uma brincadeira, pois a definio muito simples, e vou lhe explicar agora! =) Como j foi explicado no captulo anterior, na realidade apenas undefined de fato umtipo primitivo de dado, null um tipo de objeto, quando fazemos sua inspeo no console podemos verificar isso. O valor undefined aparece quando declaramos uma varivel e no atribumos a ela nenhum valor. J o valor null um valor que deve ser atribudo a uma varivel, e representa a ausncia de valor nesta varivel. Confira os exemplos no captulo anterior na seo tipos de dados para fixar esta diferena. Operadores Unrios Alguns operadores so palavras ao invs de smbolos. Utilizamos um destes operadores muito nos exemplos do captulo anterior, o operador typeof, que produz uma string identificando o tipo do valor do elemento que voc passou a ele. ps: Para ver o operador typeof em funcionamento, volte no captulo anterior onde voc encontrar vrios exemplos da utilizao dele. O Valor dos Tipos de Operadores - Parte 2 34 Outros operadores unrios so delete e void. Para este material no se tornar muito extenso, voc pode procurar o que cada um faz aqui(delete) e aqui(void). Operadores unrios utilizam um valor para fazer seu trabalho, operadores binrios e ternrios, dois e trs valores respectivamente. Operadores de Incremento Temos dois tipos de operadores de incremento: os utilizados para nmeros e os utilizados para strings e nmeros. Incrementando Nmeros Os operadores ++ e -- so utilizados para incrementar variveis/valores do tipo number. So operadores frequentemente utilizados para auxiliar na estrutura lgica do programa, aumentando ou diminuindo em uma unidade o valor da varivel. A partir do prximo captulo iremos comear a focar em pedaos de cdigo maiores, e assim iniciar a criao de mini-programas, para depois chegarmos no nosso objeto de juntar todas essas peas para criarmos o que quisermos. Por agora, vamos ver no console como funcionam estes operadores. Uma ltima informao. Estes operadores podem ser utilizados antes ou depois da varivel, sendo assim denominados operadores de pr-incremento ou ps-incremento. Qual a diferena entre eles? A diferena que quando utilizamos o operador antes da varivel, ela ser alterada antes da execuo do cdigo, ento o valor processado para a operao atual ser o j modificado, e quando usamos o operador depois da varivel, essa alterao ser percebida apenas depois quando esta varivel for solicitada. Vamos aos testes! 1 var total = 0; 2 total++ // -> 0 (valor foi alterado, mas ser percebido na prxima operao) 3 total // -> 1 4 ++total // -> 2 5 --total // -> 1 6 total-- // -> 1 7 total // -> 0 https://developer.mozilla.org/pt-BR/docs/JavaScript/Guide/Expressions_and_Operators#delete https://developer.mozilla.org/pt-BR/docs/JavaScript/Guide/Expressions_and_Operators#void O Valor dos Tipos de Operadores - Parte 2 35 Incrementando Nmeros e Strings Estes operadores sero utilizados sempre por voc! So realmente MUITO importantes e elegantes, diga-se de passagem. A funo deles adicionar mais contedo a antiga varivel mas sem precisar declarar isso de forma verbosa (escrevendo mais do que se poderia/deveria). De fato, estes operadores operam e atribuem o valor para a mesma varivel. Ele pode ser utilizado para somar, subtrair, multiplicar e dividir nmeros, ou para concatenar novas strings em variveis que contm valores deste tipo. Vamos dar uma olhada como estes operadores trabalham. 1 // somando nmeros 2 var resultado = 7 3 resultado += 6 // -> 13 4 5 // concatenando strings 6 var meuNome = 'Eric' 7 meuNome += ' Douglas' // -> "Eric Douglas" 8 9 // subtraindo nmeros 10 resultado -= 6 // -> 7 11 12 // multiplicando nmeros 13 resultado *= 3 // -> 21 14 15 // dividindo nmeros 16 resultado /= 2 // -> 10.5 17 18 // resto da diviso de nmeros 19 resultado %= 2 // -> 0.5 20 21 // um exemplo de como somar na mesma varivel 22 // sem usar estes operadores 23 resultado = resultado + 0.8 // -> 1.3 Operadores de Comparao Operadores de comparao so um dos tipos de operadores binrios, que no caso, utilizam dois valores para efetuarem a operao. Os operadores de comparao sempre retornam um booleano, dizendo se a comparao verdadeira ou falsa. So tambm utilizados na estrutura lgica do programa. Vamos conhecer estes operadores! O Valor dos Tipos de Operadores - Parte 2 36 < : menor que - verifica se o nmero da esquerda menor que o nmero/string da direita <= : menor ou igual que - verifica se o nmero da esquerda menor ou igual ao nmero/string da direita > : maior que - verifica se o nmero da esquerda maior que o nmero/string da direita >= : maior ou igual que - verifica se o nmero da esquerda maior ou igual ao nmero/string da direita Cuidado ao Comparar Strings! A maneira de comparar strings pode no ser muito intuitiva, pois qualquer letra maiscula ser sempre menor que uma letra minscula. Vamos confirmar toda essa teoria agora. J sab n? Console! =) 1 13 < 26 // -> true 2 3 'treze' < 'Vinte seis' // -> false *preste ateno aqui* 4 5 var treze = 13 6 treze <= 13 // -> true 7 8 26 > 13 // -> true 9 'vinte seis' > 'Treze' // -> true Comparadores de Igualdade Alm dos comparadores mostrados acima, tambm temos os comparadores de igualdade, que so constantemente usados em nossos cdigos, porm tem algumas peculiaridades que se voc no souber, certamente ir gerar erros nos seus programas. Mas fique tranquilo, bem simples de entender a diferena entre eles, e irei lhe provar agora! Primeiro, vamos conhecer quais so estes outros operadores. ==: testa igualdade !=: testa desigualdade ===: testa igualdade de forma restrita !==: testa desigual- dade de forma restrita Agrande diferena entre umoperador e outro que a primeira dupla (== e !=) ao comparar os valores, caso eles no sejam do mesmo tipo, procedem com uma particularidade do JavaScript chamada de Coero de Tipo (ou converso de tipo), e isso pode gerar muita dor de cabea para voc. Srio! Irei explicar sobre coero de tipo no prximo tpico, mas antes vamos tentar entender pelo cdigo, de forma prtica, como cada operador trabalha, e depois irei explicar de forma terica e encerrar o assunto. Vamos l! O Valor dos Tipos de Operadores - Parte 2 37 1 '13' == 13 // -> true 2 '13' != 13 // -> false 3 4 '13' === 13 // -> false 5 '13' !== 13 // -> true Vale ressaltar mais uma vez Entender o que est acontecendo no cdigo super importante, e muitas vezes temos que realmente ler vrias vezes e/ou ficar vrios minutos para conseguir entend-lo. E sim, isso algo super importante, no tenha d de investir tempo nisso! Neste prximo tpico irei lhe explicar o que aconteceu no cdigo anterior, ento, vamos para o prximo! Coero de Tipos O nome assusta um pouco n?! E de fato devemos ter cuidado com isso pois surgem muitas bugs no seu cdigo a partir deste esforo que o JavaScript faz para efetuar todas as instrues recebidas. Sempre que voc usa um operador no JavaScript (no caso ento, faz uma operao), voc ir receber um valor de retorno, nunca um erro, mesmo que voc tente trabalhar com tipos diferentes de dados. A coero de tipos (ou converso de tipos) justamente isso! Quando tentamos fazer operaes com tipos de dados diferentes, o JavaScript nos agracia com a converso de um dos valores para algum outro tipo S que o grande e terrvel problema disso que dificilmente voc consegue prever qual ser este novo valor, pois as regras para tal converso no so intuitivas, o que pode causar alguma(s) falha(s) em sua aplicao. Como Evitar a Coero de Tipos Para evitar toda essa preocupao, voc deve usar os operadores === e !==, que fazem a mesma verificao de igualdade que seus primos, porm NO fazem coero de tipos! ps: Por questes de segurana, sempre opte por usar os comparadores de igualdade restrita. Parabns! Agora voc finalmente sabe o que essa bendita coero de tipos e como evit-la! lol Quando algo que no obviamente um nmero convertido para tal, o valor dessa operao convertido para NaN. Portanto, sempre que encontrar NaN em seu cdigo, procure por coeres de tipo acidentais. O Valor dos Tipos de Operadores - Parte 2 38 Operadores Lgicos Sempre que pensamos na parte lgica do programa devemos pensar em valores booleanos, e para gerar estes valores booleanos a partir dos valores que nossas variveis carregam, iremos usar os operadores lgicos, que so um tipo de operador binrio, ou seja, necessitam de dois valores para gerao de um terceiro. ps: O operador ! um operador lgico pois retorna um valor booleano, porm uma exceo a regra por ser um operador unrio. Conhea agora os operadores lgicos: && : este operador chamado de E lgico || : este operador chamado de OU lgico ! : este operador chamado de NO lgico && E lgico Este operador lgico e binrio retorna true se ambos os valores (ou operandos) forem verdadeiros. Isso no caso ser utilizado em estruturas condicionais, assunto que iremos abordar no prximo captulo. Por enquanto voc s precisa saber disso. || OU lgico Este operador lgico e binrio retorna true se um dos valores forem verdadeiros. ! NO lgico Como j vimos anteriormente, este operador transforma o operando em booleano, porm com a peculiaridade de inverter seu valor truthy/falsy para um booleano de fato. Curiosidades sobre os Operadores Lgicos Quando utilizamos os operadores lgicos fora de estruturas condicionais, eles tem uma forma peculiar de trabalhar, que vale muito a pena ser entendida para que possamos deixar nosso cdigo mais elegante e conciso. Sempre que usamos && e ||, eles convertemo valor do lado esquerdo para umbooleano, para saberem qual valor ser retornado dessa operao. Entendendo o Operador || O operador || retorna o valor da sua esquerda quando ele pode ser convertido para true, ou seja, quando seu valor do tipo truthy, e sempre retorna o valor da direita caso contrrio, independente de qual valor seja esse, at mesmo outro valor falsy. Veja isso na prtica. O Valor dos Tipos de Operadores - Parte 2 39 1 var esquerda = '' // -> valor do tipo falsy 2 var direita = 13 // -> valor do tipo truthy 3 4 esquerda || direita // -> 13 5 6 var direita = 0 // -> agora vamos atribuir este valor falsy na direita e ver o qu\ 7 e acontece 8 9 esquerda || direita // -> 0 10 11 // Agora vamos deixar ambos os valores truthy 12 13 esquerda = 13 14 direita = 31 15 16 esquerda || direita // -> 13 Viram? Mesmo o valor da direita sendo falsy, ele retornado pois a regra : se o valor da esquerda for falsy, retorne o da direita sem nem ver qual . E depois, quando alteramos o valor da esquerda para um valor truthy, ele foi retornado. Legal n?! =) Vamos ver agora o outro operador. Entendendo o Operador && Este operador faz o contrrio. Quando o valor da esquerda falsy, ele retornado, independente de qual valor seja o da sua direita. E o valor da direita sempre ser retornado quando o da esquerda for truthy, mesmo que este valor da direita seja falsy. Vamos ver o cdigo para ficar mais claro. 1 var esquerda = NaN // -> valor do tipo falsy 2 var direita = 13 // -> valor do tipo truthy 3 4 esquerda && direita // -> NaN 5 6 var esquerda = 31 // agora vamos atribuir um valor truthy na esquerda e ver o que\ 7 acontece 8 9 esquerda && direita // -> 13 10 11 // Agora vamos deixar o valor da direita falsy 12 13 direita = '' 14 15 esquerda && direita // -> '' O Valor dos Tipos de Operadores - Parte 2 40 Muito bom! Estamos quase terminando, e a essa altura voc j sabe de vrias peculiaridades do JavaScript! Vamos em frente =) Operador Ternrio Este operador de fato muito poderoso, pois evita verbosidade no cdigo, deixando-o ento bem mais elegante. Ele chamado operador ternrio pois envolve trs peas em sua operao. Vamos analis-lo abaixo. Primeiramente irei mostr-lo em funcionamento e depois irei explic-lo. 1 var usuario = '' 2 3 // usando o operador ternrio 4 usuario ? usuario : 'convidado' // -> "convidado" 5 6 // atribuindo um valor a varivel usuario 7 usuario = 'Eric' 8 9 // usando o operador ternrio novamente 10 usuario ? usuario : 'convidado' // -> "Eric" Como funciona isso? Lhe explico j! Primeiramente criamos a varivel usuario e atribuimos uma string vazia a ela. Ou seja, um valor falsy. Aps isso, usamos o operador ternrio que funciona da seguinte forma: 1. Indicamos a varivel ou condio que deve ser avaliada. No caso, usamos a varivel usuario. 2. Este valor a ser analisado ser transformado em um booleano, a partir de seu valor truthy/false (est vendo a importncia da teoria?!) 3. Caso seu valor seja truthy, ento o operador retorna a instruo aps o sinal ?. Caso o valor seja falsy, o valor retornado ser o que est aps o sinal :. 4. Voc pode retornar qualquer expresso JavaScript como valor de retorno dessa avaliao, veja outro exemplo: var cozinheiro = false cozinheiro ? { receitas : [ carnes,doces,tortas } ] console.log(mexido e olhe l!) // -> mexido e olhe l! Entendeu como funciona? Esse operador muito legal! =D ps: Altere o valor de cozinheiro para true e veja o que acontece! O Valor dos Tipos de Operadores - Parte 2 41 Regras de Precedncia Para saber qual operao ir ocorrer primeiro, voc precisa conhecer a ordem de precedncia dos operadores. Confira abaixo a lista na ordem do maior (no topo) para o menor (embaixo) operador em relao a sua precedncia. ++, -- pr/ps incremento/decremento ! altera valor booleano typeof, determina o tipo do operando *, / e % multiplica, divide e resto + e - soma e subtrai + concatena strings <, <=, > e >= comparao de ordem numrica <, <=, > e >= comparao de ordem alfabtica == teste de igualdade != teste de desigualdade === teste de igualdade restrita !== teste de desigualdade restrita && E lgico || OU lgico ?: operador ternrio = atribuio varivel ou propriedade *=, /=, %=, += e -= operao e atribuio Veja mais sobre regras de precendncia aqui Concluso Finalmente terminamos! Bom, esse foi o maior captulo at agora, e com certeza foi o mais interessante, por termos visto vrias peculiaridades da linguagem JavaScript e termos sedimentado uma base slida para os captulos seguintes. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence Expresses JavaScript Vamos continuar com nossa longa jornada, rumo maestria em JavaScript! Neste captulo falaremos exclusivamente sobre expresses. Confira um resumo do que ser abordado: 1. O que uma Expresso? 2. Expresses Bsicas 3. Expresses Complexas Expresses de Inicializao Expresses de Definio Expresses para Acessar Propriedades Expresses de Invocao Expresses de Criao 4. Mais Expresses Expresses Matemticas Expresses de Relao Expresses Lgicas Expresses de Atribuio Expresses JavaScript 43 O que uma Expresso Expresso um fragmento de cdigo JavaScript que pode ser interpretado para produo de um valor. Fazendo uma breve analogia, a expresso est para seu programa JavaScript assim como uma frase est para um texto. Um exemplo de expresso uma atribuio de valor uma varivel. 1 var atribui = 'e a nvoa comea a se dissipar...' Podemos combinar expresses para formar outras mais elaboradas. Vimos vrias expresses no captulo anterior, enquanto falvamos sobre os operadores. Todos aqueles exemplos so timos para o entendimento de expresses. Na realidade, o que iremos ver hoje apenas uma formalizao do estudo passado, apenas nomeando coisas que j sabemos intuitivamente. Aproveite pois o captulo de hoje ser bem leve, mas fique sabendo que nossa base para criao de programas JavaScript est quase pronta, e em breve a diverso ir comear de fato ;D Expresses Bsicas Esse tipo de expresses so assim denominadas pois no incluem outras expresses, ou seja, so o menor fragmento possvel do nosso cdigo. Vejamos alguns exemplos: 1 // Expresses Literais 2 13 3 "JavaScript Furtivo" 4 5 // Algumas Palavras Reservadas 6 true 7 false 8 null 9 10 // Referncias variveis 11 total 12 i Expresses JavaScript 44 Expresses de Inicializao Essas expresses so muito importantes, pois nos possibilitam a criao de objetos e arrays de forma literal, e isso nos d uma facilidade e praticidade muito grande na hora de tais tarefas. Veja abaixo a forma de se criar um objeto e array de forma literal e da forma utilizada com o auxlios de seus construtores (iremos conhecer mais sobre construtores futuramente). 1 /* Inicializando de forma literal */ 2 var meuObjeto = {}; // criado um objeto vazio 3 var meuArray = []; // criado um array vazio 4 5 /* Inicializando com Construtores */ 6 var meuObjeto2 = new Object(); 7 var meuArray2 = new Array(); 8 9 // Quando criamos objetos/arrays vazios, podemos omitir os parnteses 10 var objetoVazio = new Object; 11 var arrayVazio = new Array; Viram o quo econmica e elegante a forma literal de inicializao de objetos e arrays? Use-a sem moderao! Um dos motivos de enquadrarmos esta e as expresses seguintes no campo de expresses complexas, que elas podem receber as expresses bsicas para comporem seu valor, pois obviamente, um objeto, um array, s so teis por carregarem em si valores agrupados de acordo com algum propsito. Alm de valores bsicos, podemos tambm passar valores complexos para expresses complexas. Traduzindo, ter arrays dentro de arrays, objetos dentro de objetos, arrays dentro de objetos, objetos dentro de arrays, e por ai vai Vamos agora ento, dar sentido a existncia de nossos objetos e arrays! 1 var estudos = { 2 JavaScript: [ 3 'NodeJS', 4 'AngularJS', 5 'ExpressJS', 6 'MongoDB' 7 ], 8 Outros: [ 'Jade', 'Stylus' ] 9 }; 10 11 var livros = [ 12 'Padres JavaScript', Expresses JavaScript 45 13 'JavaScript: O Guia Definitivo', 14 'O Melhor do JavaScript' 15 ]; No exemplo acima, na varivel estudos (que um objeto, veja pelo sinal {} que abraa os demais valores), temos as propriedades JavaScript e Outros recebendo arrays como valores, e estes arrays recebem strings, por sua vez. No caso da varivel livros, que um array [], ela recebe trs strings como itens de sua lista de valores. Brinque um pouco agora criando arrays e objetos de diferentes tipos, preenchidos com diversos valores! Expresses de Definio Usamos essa expresso para definir uma funo em nosso programa. Para criarmos essa expresso devemos seguir os seguintes passos: 1. Usar a palavra chave function 2. [opcional] Dar um nome para a funo (caso no tenha nome, iremos cham-la de funo annima) 3. Passar os argumentos que sero usados na funo, que podem ser de 0 (zero) at quantos voc quiser, todos colocados dentro dos parnteses () e separados por vrgulas. Ex: (valor1, valor2, valor3) 4. Criao do corpo da funo, que conter outras expresses, que so as tarefas que devero ser feitas todas as vezes que a funo for chamada. O corpo da funo delimitado por chaves { ... mais expresses aqui ... } Para chamarmos nossa funo posteriormente, devemos ou atribu-la a uma varivel ou ento nome-la. Veja alguns exemplos: 1 function nomeada() { 2 // outras expresses aqui 3 } 4 5 var outraFuncao = function(parametro1, parametro2) { 6 // mais expresses aqui 7 } Expresses JavaScript 46 Expresses para Acessar Propriedades Usamos esse tipo de expresso para obter o valor de alguma propriedade/item de um objeto ou um array. Podemos fazer isso usando dois tipos de sintaxe diferentes, a de notao por ponto (expressao.chave) ou a de notao por colchetes (expresso['chave']). Vamos ver com mais detalhes cada uma delas. Acessando Propriedades com ponto expresso.chave Essa forma utilizada exclusivamente para acessar propriedades e mtodos de objetos. Onde temos escrito expresso, iremos utilizar o nome do nosso objeto, e onde temos chave, iremos passar o nome da propriedade/mtodo que queremos avaliar. Vamos para o console e tornar isso mais claro. 1 var guitarras = { 2 modelo1: 'music man', 3 modelo2: 'ibanez', 4 modelo3: 'prs', 5 cordas: [ 'elixir', 'daddario' ] 6 }; 7 8 // Se quisermos ento saber o valor do modelo2... 9 guitarras.modelo2 // -> 'ibanez' 10 11 // O valor do segundo item do array "cordas" 12 guitarras.cordas.2 // -> SyntaxError: Unexpected number Notem que tivemos um erro ao tentar acessar o segundo item da propriedade cordas! Isso se deve pelo motivo que para acessar itens de arrays, utilizamos outro tipo de notao, que irei lhe explicar agora! Acessando Itens e Propriedades com Colchetes expresso['chave'] Com esse tipo de notao podemos acessar tanto os itens de um array quanto as propriedades de um objeto. Onde temos o valor expresso iremos substituir pelo nome do array ou objeto, e onde temos chave, iremos substituir pela posio do item (caso seja um array) ou pelo nome da propriedade, caso seja um objeto. Vamos agora utilizar do nosso exemplo anterior, porm acessando o objeto e o array com esta notao por colchetes. Expresses JavaScript 47 1 var guitarras = { 2 modelo1: 'music man', 3 modelo2: 'ibanez', 4 modelo3: 'prs', 5 cordas: [ 'elixir', 'daddario' ] 6 }; 7 8 // Se quisermos ento saber o valor do modelo2... 9 guitarras['modelo2'] // -> 'ibanez' 10 11 // O valor do segundo item do array "cordas" 12 guitarras.cordas[1] // -> 'daddario' 13 14 // uma peculiaridade dessa notao: podemos passar um valor 15 // contido em uma varivel como a chave para buscar um item/propriedade 16 var modeloPreferido = 'modelo1'; 17 guitarras[modeloPreferido] // -> 'music man' Dicas de Acessibilidade Caso voc tente acessar propriedades em null e undefined, voc obter uma exceo TypeError, ou seja, um erro, pois esses valores no podem ter propriedades. Caso acesse uma propriedade ou ndice que no esteja definido, o valor retornado ser undefined. A notao de ponto, por ser mais direta, deve ser utilizada quando j se sabe exatamente qual propriedade ser acessada. A notao por colchetes permite que seja passado variveis como valor para acesso, pois caso a propriedade tenha sua chave (identificador) sendo um nmero, contendo espao no nome ou sendo uma palavra reservada de JavaScript, a nica forma de acess-la assim, atravs da notao de colchetes, utilizando ou no uma varivel para conteno desse valor. Expresses de Invocao Essa expresso utilizada para chamar (invocar, executar) uma funo ou mtodo. Quando uma funo est atribuda uma chave em um objeto, essa passa a se chamar mtodo. Para usar essa expresso devemos indicar o nome da funo que desejamos invocar seguida de parnteses. Caso a funo receba argumentos, os mesmos devem ser passados dentro dos parnteses. Expresses JavaScript 48 ps: Lembre-se de usar no seu cdigo o ; depois de chamar a funo! Somente omitiremos o ponto e vrgula no console para agilizar os testes. Vamos ver um exemplo: 1 // definindo uma funo: expresso de definio 2 function multiplica( valor1, valor2 ) { 3 return valor1 * valor2; 4 } 5 6 // chamando a funo: expresso de invocao 7 multiplica( 5, 8 ); // -> 40 8 multiplica( 3, 13 ); // -> 39 Entendendo o Processo de Invocao Irei explicar sucintamente como funciona este processo, o qual ser devidamente aprofundado quando estivermos falando especificamente sobre funes. Veja quais so as etapas: 1. Verificao da existncia de uma funo (ou objeto, visto que a funo um tipo de objeto) com o nome passado. Caso no exista tal objeto, um erro lanado. 2. Criao de uma lista de valores a partir dos argumentos passados, que so avaliados para produzirem tais valores. 3. Atribuio dos valores aos respectivos parmetros da funo. 4. Execuo do corpo da funo. 5. Se a funo tiver return, esse valor ser o retornado como resultado da avaliao da funo. Expresses de Criao So utilizadas como uma alternativa na forma de se criar objetos. bom ter conhecimento dessas expresses, mas saiba que dificilmente voc ir utiliz-las (para arrays e objetos), pois a forma literal bem mais direta. Nessas expresses utilizamos as funes construtoras para criar novos objetos, juntamente com a palavra chave new (iremos estudar sobre funes construtoras mais a frente). Alguns exemplos da utilizao dessas expresses: 1 var cestaDeCompras = new Object(); 2 var dataDeAgora = new Date(); 3 var listaDeCompras = new Array(); Expresses JavaScript 49 Mais Expresses No ltimo captulo j vimos vrios exemplos de expresses que utilizam operadores. Irei deixar aqui indicado o nome da expresso com seus respectivos operadores, e aps vista a teoria aqui, v para o outro captulo e procure as respectivas expresses em uso. Os outros tipos de expresses que temos so: Expresses Matemticas ou Aritmticas: +, -, /, *, % Expresses Relacionais: ==, ===, !=, !==, <, >, <=, >= Expresses Lgicas: &&, ||, ! Expresses de Atribuio: +=, -=, *=, /=, %=