Programaçao De Scripts - Aula 05
Javascript
Como viamos na Programaçao de Scripts - Aula 01 , o javascript são as funcionalidades do carro, mas unido ao Node é como o motor do mesmo.
Vamos começar com essas funcionalidades “públicas”, que irá ajudar-nos a dar um dinamismo para o nosso site.
A Tag Script
Para exibirmos um comando javascript, precisamos de uma tag html para identificar um script em específico.
html code snippet start
<script>
console.log("Hello World!");
</script>
html code snippet end
Esta tag pode ser utilizada dentro do <head>
ou dentro do <body>
,
e tudo o que estiver dentro da tag <script>
ele irá processar.
No entanto, é de bom tom (e boas práticas) colocar os scripts no fim do corpo do site, no fim do body, para que seus scripts não impeçam o carregamento da estrutura do seu site.
html code snippet start
<!DOCTYPE html>
<html>
<head>
<title>Exemplo</title>
</head>
<body>
<!--Corpo do site-->
<script>
/*Seus scripts*/
</script>
</body>
</html>
html code snippet end
Ao invés de ter o script escrito no corpo do seu site, nós podemos passar um parâmetro “source” para procurar um arquivo e carregá-lo.
<script src="caminho/do/arquivo.js"></script>
Isto também é boas práticas, pois a modularização em ter em arquivos separados torna mais fácil o carregamento do site (por conta do cache), e também para reutilização de scripts em diversas páginas. Imagine ter um mesmo escopo de código em todas as suas páginas de forma escrita. Tendo um arquivo com ela, ao referenciar o arquivo, o cache não vai precisar recarregar este código toda vez, mas apenas uma.
Básico de Javascript
Suas funções matemáticas são iguais às das maiores linguagens.
Na questão de variáveis, nós temos duas palavras registradas para criar e não são mais os tipos primitivos.
var x = 1;
<- Esta variável x é de escopo global e pode ser acessada
em qualquer lugar.
let x = 1;
<- Esta variável x é de escopo local, e só pode ser acessada
dentro de um mesmo escopo.
Basicamente nunca use var, pois o var mascara muito erro. Te dá a sensação de que tudo está bem, até não estar tudo bem.
Temos também o const
que, como o nome já declara, é uma constante.
Nome de variável precisa estar coerente, e se tiver
let x
é um ponto inteiro a menos no trabalho
Hoisting
Conceito teoricamente simples mas que dá muito problema se for mal feito. Hoisting é um comportamento fundamental do JavaScript onde declarações de variáveis e funções são “elevadas” (hoisted) para o topo de seu escopo atual antes da execução do código. É como se o JavaScript fisicamente movesse estas declarações para o início do escopo, embora na realidade seja uma questão de como o motor JavaScript compila e executa o código.
Variáveis declaradas com var
Quando declaramos variáveis com var
, a declaração é elevada para
o topo do escopo, mas a inicialização permanece no local original.
javascript code snippet start
console.log(nome); // undefined (não gera erro!)
var nome = "Jr";
console.log(nome); // "Jr"
javascript code snippet end
O que realmente acontece internamente é algo como:
javascript code snippet start
var nome; // Declaração é elevada para o topo
console.log(nome); // undefined (a variável existe, mas ainda sem valor)
nome = "Carlos"; // A atribuição permanece no lugar original
console.log(nome); // "Carlos"
javascript code snippet end
É por isso que o primeiro console.log
mostra undefined
em vez de
gerar um erro - a variável já existe, apenas ainda não foi inicializada.
Variáveis declaradas com let
e const
Com let
e const
, introduzidos no ES6, o comportamento é diferente:
javascript code snippet start
console.log(varExemplo); // undefined
console.log(letExemplo); // ReferenceError: Cannot access 'letExemplo' before initialization
console.log(constExemplo); // ReferenceError: Cannot access 'constExemplo' before initialization
var varExemplo = "var";
let letExemplo = "let";
const constExemplo = "const";
javascript code snippet end
Variáveis declaradas com let
e const
também são hoisted,
mas diferentemente de var
, elas ficam em uma “Zona Morta Temporal”
(Temporal Dead Zone) até que a linha de declaração seja alcançada no
código. Tentar acessá-las antes disso resulta em um erro de referência.
Por que o Hoisting Existe?
O hoisting foi originalmente projetado para permitir que programadores organizem seu código de maneira mais natural, especialmente para funções.
No entanto, para variáveis, especialmente com var
, o hoisting
pode levar a comportamentos inesperados e bugs difíceis de detectar.
Compreender esse comportamento é essencial para escrever código JavaScript
previsível e livre de bugs. let
, const
e classes, o JavaScript moderno
oferece maneiras de gerenciar o escopo de forma mais intuitiva, mas o
entendimento do hoisting continua sendo uma parte importante do domínio da
linguagem.
Operadores básicos
==
(igual a): Compara se os valores são iguais!=
(diferente de): Compara se os valores são diferentes>
(maior que): Verifica se o valor da esquerda é maior que o da direita<
(menor que): Verifica se o valor da esquerda é menor que o da direita>=
(maior ou igual a): Verifica se o valor da esquerda é maior ou igual ao da direita<=
(menor ou igual a): Verifica se o valor da esquerda é menor ou igual ao da direita
Por que JavaScript tem ===
e !==
?
JavaScript tem dois tipos adicionais de operadores de igualdade:
===
(estritamente igual a): Compara valor E tipo!==
(estritamente diferente de): Compara se o valor OU o tipo são diferentes
A razão para JavaScript ter esses operadores adicionais está relacionada com seu comportamento de coerção de tipos. JavaScript é uma linguagem de tipagem dinâmica e fraca, o que significa que ela tenta converter (coagir) automaticamente tipos diferentes quando necessário.
Exemplo com ==
(igualdade com coerção)
javascript code snippet start
5 == "5" // true (string "5" é convertida para número 5)
0 == false // true (false é convertido para 0)
null == undefined // true (considerados equivalentes)
javascript code snippet end
Exemplo com ===
(igualdade estrita)
javascript code snippet start
5 === "5" // false (tipos diferentes: número vs string)
0 === false // false (tipos diferentes: número vs booleano)
null === undefined // false (tipos diferentes)
javascript code snippet end
Recomenda-se usar ===
e !==
por padrão, a menos que você tenha uma
razão específica para não utilizar.
Tipos de Dados em JavaScript
JavaScript possui sete tipos de dados primitivos:
Number: Representa números inteiros e de ponto flutuante
javascript code snippet start
let inteiro = 42; let decimal = 3.14;
javascript code snippet end
String: Sequências de caracteres
javascript code snippet start
let texto = "Hello"; let aspasSimples = 'World'; let templateString = `Hello ${texto}`;
javascript code snippet end
Boolean: Valores lógicos verdadeiro/falso
javascript code snippet start
let verdadeiro = true; let falso = false;
javascript code snippet end
Undefined: Valor atribuído automaticamente a variáveis declaradas mas não inicializadas
javascript code snippet start
let naoDefinido; // valor é undefined
javascript code snippet end
Null: Representa a ausência intencional de valor
javascript code snippet start
let vazio = null;
javascript code snippet end
Symbol (ES6): Valor único e imutável, usado como identificador
javascript code snippet start
let simbolo = Symbol('descricao');
javascript code snippet end
BigInt (ES2020): Para inteiros de precisão arbitrária
javascript code snippet start
let numeroGrande = 9007199254740991n;
javascript code snippet end
Além destes, JavaScript tem um tipo de dados complexo:
Object: Coleção de propriedades
javascript code snippet start
let pessoa = {nome: "Ana", idade: 30};
javascript code snippet end
Arrays, funções e datas são todos objetos em JavaScript:
javascript code snippet start
let array = [1, 2, 3];
let funcao = function() { return true; };
let data = new Date();
javascript code snippet end
JavaScript é uma linguagem de tipagem dinâmica, o que significa que as variáveis não são associadas a um tipo específico e podem mudar de tipo:
javascript code snippet start
let x = 10; // x é um número
x = "texto"; // agora x é uma string
javascript code snippet end
Para verificar o tipo, use o operador typeof
:
javascript code snippet start
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (isso é um bug de um milhão de dólares)
typeof {}; // "object"
typeof []; // "object" (arrays são objetos)
typeof function(){}; // "function"
javascript code snippet end
O fato de arrays serem objetos é importantíssimo para que possamos utilizar métodos desta classe como
push()
epop()
nativamente dentro do seu array, assim como em Java, Rust e outras linguagens.