# JavaScript Notes ## -> O JS pode ser adicionado de 3 formas: - EXTERNO: linkado à um arquivo **.js** onde está todo o código. (é o modo mais recomendado, tendo em vista a maior facilidade de manutenção e tempo de carregamento da página). - exemplo linkado à um arquivo (as tags podem ser inseridas dentro das tags **head** ou **body**, sendo o mais recomendado como última linha dentro da tag **body**, pois melhora a velocidade de carregamento da página). Dentro de *src* inserir o nome do arquivo: ```html <script src="script.js"></script> ``` ou se o arquivo estiver dentro de uma pasta além da pasta onde está o HTML, procedemos como no caso de imagens, acrescentando nome da pasta e \: ```html <script src="nomeDaPasta/script.js"></script> ``` - INTERNO: no próprio HTML, com o código dentro das tags '**script**' que podem ser adicionadas tanto dentro da tag '**head**' quanto da tag '**body**' (em uma ou ambas dependendo da necessidade.) ```html <script> document.getElementById("sayHello").innerHTML = "Hello!"; </script> ``` - REFERÊNCIA EXTERNA: pode-se utilizar uma referência externa. Exemplo: ```html <script src="https://www.endereco.com/js/script.js"></script> ``` # JS: Valores primitivos e objetos *O valor primitivo não tem parâmetros e métodos (mas tem propriedades).* Valores primitivos: - String - Number - Boolean - Null - undefined - Symbol (novo no ECMAScript 6) **Todos os outros valores, que não são primitivos, são objetos!** --- # Output - console.log() - console.table() - window.alert() - document.write() - inner.HTML ## console.log() Irá aparecer no console do browser. Mais usado para testar o código. ## console.table() Tabela exibida no console do browser. ## window.alert() Irá abrir uma pequena caixa de alerta no browser. ## document.write() Modifica o conteúdo HTML para exibição. ## inner.HTML Modifica o conteúdo HTML para exibição. No exemplo abaixo, *document* referencia-se ao arquivo HTML, *getElementById* diz para 'pegar'/ buscar um elemento no HTML e 'escrever'/modificar o conteúdo que está sobre esse *id* para o conteúdo que desejamos, no caso, a string "Olá!". Exemplo: ```html <script> document.getElementById("exemplo").innerHTML = "Olá!"; </script> ``` HTML -> procura a tag que tem um *id* especificado -> insere conteúdo na página. Exemplos de [W3Schools](https://www.w3schools.com/js/js_output.asp) # Arrays [ ] Sintaxe: `var array = []` Array exemplo: *a, b e c* são elementos do array: ```js var myArray = [a, b, c]; ``` Chamamos de índice a posição dos elementos no array. Os índices sempre começam pelo 0. assim os índices serão: 0, 1, 2, ... ### Verificar se é array ```js var arr = [] Array.isArray(arr) // true ``` ### Manipulando arrays - acessar um item do array através do índice: *Utiliza-se notação de colchetes ([]) para acessar os item através de seus índices.* ```js arr = [1, 2, 3] arr[0] // retorna: 1 arr[1] // retorna: 2 arr[2] // retorna: 3 ``` - add no final do array -> **push()** Considere: `let myArray = [1, 2, 3]`; ```js myArray.push(4); => [1, 2, 3, 4] ``` - add no começo do array -> **unshift()** ```js myArray.unshift(0); => [0, 1, 2, 3, 4] ``` - remover no final do array -> **pop()** ```js myArray.pop(); => [0, 1, 2, 3] ``` - remover no começo do array -> **shift()** ```js myArray.shift(); => [1, 2, 3] ``` ### Fazer cópia de array Em alguns momentos, podemos querer copiar um array, por exemplo, para manipular o array sem modificar seu estado original, pois alguns métodos modificam o array original (como é o caso de sort e reverse, que veremos a seguir). ```js [...arr] ``` ex ```js let myArr = [1, 2, 3] let newArr = [...myArr] // [1, 2, 3] let otherArr = [0, ...myArr, 4, 5, 6, 7, 8, 9, 10] ``` ### Array em ordem crescente (sort()) * sort altera o array principal! * funciona para números e strings * ordena arrays em ordem crescente * para ordenar arrays em forma decrescente, use o método reverse() ```js arr.sort() ``` Exemplo: ```js let array = [1, 5, 4, 2, 3] array.sort() // resultado: array = [1, 2, 3, 4, 5] ``` Exemplo com string: ```js let names = ["June", "Amora", "Ozzy", "Bob", "Scott"] names.sort() // resutado: names = ["Amora", "Bob", "June", "Ozzy", "Scott"] ``` **Fazer uma cópia de array ajuda para ordenar um array sem necessáriamente alterar o array principal!** Exemplo: ```js let names = ["June", "Amora", "Ozzy", "Bob", "Scott"] let namesSorted = [...names].sort() ``` Assim, names continua em seu estado original, e temos um novo array 'baseado' no primeiro, porém ordenado: ```js // resutado: names = ["June", "Amora", "Ozzy", "Bob", "Scott"] namesSorted = ["Amora", "Bob", "June", "Ozzy", "Scott"] ``` ### Trabalhando com sort(): arrays com objetos Para ordenamos arrays com objetos, temos uma forma um pouco diferente de usarmos o método sort, que irá variar para ordenar números e strings. Considere o array abaixo: ```js let friends = [ {name: "Rui", age: 21}, {name: "Manoela", age: 32}, {name: "Felipe", age: 22}, {name: "Valentina", age: 21} ] ``` #### Ordenando o array **friends** em ordem alfabética (nome) ```js let sortNames = friends.sort(function(a, b) { var nameA = a.name.toUpperCase(); var nameB = b.name.toUpperCase(); if (nameA < nameB) { return -1; } if (nameA > nameB) { return 1; } return 0; }); console.log(sortNames); // resultado: [ {name: "Felipe", age: 22}, {name: "Manoela", age: 32}, {name: "Rui", age: 21}, {name: "Valentina", age: 21} ] ``` #### Ordenando o array **friends** em ordem crescente (idade) Considerando o mesmo array friends do exemplo anterior, vamos ordenar por idade ao invés de nomes: ```js let sortAges = friends.sort(function (a, b) { return a.age - b.age; }); console.log(sortAges); // resultado: [ {name: "Rui", age: 21}, {name: "Valentina", age: 21} {name: "Felipe", age: 22}, {name: "Manoela", age: 32}, ] ``` ### Arrays em ordem decrescente (reverse()) * é o inverso de sort() * modifica o array original Exemplo: ```js names = ["Amora", "Bob", "June", "Ozzy", "Scott"] names.reverse() // resultado: names = ["Scott", "Ozzy", "June", "Bob", "Amora"] ``` ## map() Transforma um array, retornando um array do mesmo tamanho. *dica: bom para quando é necessário transformar os elementos de um array* **sintaxe** ```js array.map(function(valorAtual, index, arr), thisValue) ``` onde, `index, arr, thisValue` são opcionais. **exemplo** ```js let persons = [ { firstName: 'Lays', lastName: 'Hidani' }, { firstName: 'June', lastName: 'Hidani' } ] persons.map(person => person.firstName + ' ' + person.lastName ) // resultado: ["Lays Hidani", "June Hidani"] ``` ## filter() Filtra itens de um array, seguindo algumas condições. *dica: bom para selecionar um subconjunto de um array* **sintaxe** ```js array.filter(function(valorAtual, index, arr), thisValue) ``` onde, `index, arr, thisValue` são opcionais. **exemplo** ```js let pets = [ { nome: 'June', cor: 'cinza', gender: 'femea', idade: 8 }, { nome: 'Rui', cor: 'tigrado', gender: 'macho', idade: 1 }, { nome: 'Ozzy', cor: 'marrom', gender: 'macho', idade: 12 }, { nome: 'Dexter', cor: 'tigrado', gender: 'macho', idade: 1 } ] const filtro = pets.filter(pet => (pet.idade > 5)) console.table(filtro) ``` resultado: ![filter exemplo](img/filter-ex.png) ## some() Verificação booleana. Retorna `true` se algum item do array responde à condição. **sintaxe** ```js array.some(function(valorAtual, index, arr), thisValue) ``` onde, `index, arr, thisValue` são opcionais. ```js pets.some(pet => pet.cor === 'tigrado') // resultado: true ``` ## every() Verificação booleana. Retorna `true` se todos os itens do array responde à condição. **sintaxe** ```js array.every(function(valorAtual, index, arr), thisValue) ``` onde, `index, arr, thisValue` são opcionais. **exemplo** ```js pets.every(pet => pet.cor === 'marrom') // resultado: false ``` ## find() Procura um item no array. *dica: use para selecionar um único elemento do array* **sintaxe** ```js array.find(function(valorAtual, index, arr), thisValue) ``` onde, `index, arr, thisValue` são opcionais. **exemplo** ```js pets.find(pet => pet.cor === 'marrom') //resultado: {nome: "Ozzy", cor: "marrom", gender: "macho", idade: 12} ``` ## forEach() Itera o array para executar determinada ação. Boa substituta do loop `for`. **sintaxe** ```js array.forEach(function(valorAtual, index, arr), thisValue) ``` onde, `index, arr, thisValue` são opcionais. **exemplo** ```js var array = [0, 1, 2, 3, 4, 5]; var total = 0; function sum(number) { total += number; } array.forEach(sum); console.log(total); // resultado: 15 ``` ## reduce() *dica: use para derivar um único valor de outros vários elementos de um array.* **sintaxe** ```js array.reduce(function(total, valorAtual, index, arr), valorInicial) ``` onde, `index, arr, valorInicial` são opcionais. **exemplo** ```js let array = [1, 2, 3, 4, 5] let result = array.reduce((total, number) => total + number) console.log(result) // resultado: 15 ``` ## Fatiar Array ou String slice() > extrai o texto de uma string e retorna uma nova string. Alterações no texto em uma string não afetam a outra string. -MDN **Sintaxe** ```js array.slice(indexInicial, indexFinal) ``` onde `indexFinal` se não indicado, considera até o final do array **Exemplo** ```js 'Tudo bem?'.slice(5) // => resultado: "bem?" ``` ## Alterar conteúdo do array splice() > Altera o conteúdo de um array removendo ou substituindo elementos existentes e / ou adicionando novos elementos. -MDN **Sintaxe** ```js array.splice(index, howmany, item1, ....., itemX) ``` onde `howmany` e `items` são opicionais. **Exemplo** ```js let numbers = ['zero', 'um', 2, 3, 4, 'cinco'] numbers.splice(2, 3, 'dois', 'três', 'quatro') // retorna [2, 3, 4] console.log(numbers) // Resultado: ["zero", "um", "dois", "três", "quatro", "cinco"] ``` Neste exemplo, dissemos ao `splice(2, 3, 'dois', 'três', 'quatro')` para começar no **índice 2** do nosso array `numbers`, pegar os **3 elementos** a partir do índice 2, e substituí-los pelos elementos **'dois', 'três', 'quatro'**. Ele irá nos retornar os elementos que foram removidos. Em seguida, podemos verificar essa substituição ao conferir os valores de numbers novamente. --- # Ternário (versão reduzida de uma condição) - if normal: ```js if ( x < 10 ) { console.log( x ); } else { console.log( 10 ); } ``` - ternário ```js x < 10 ? console.log( x ) : console.log( y ); ``` --- # Objetos conjunto de pares chave/valor (key/value) ```js const obj = { chave: valor } ``` ## Acessar valor `obj.chave` ou `obj['chave']` ## Alguns Métodos ```js var myObj = { primeiroNome: 'Lays', ultimoNome: 'Hidani', idade: 28, pets: ['Dexter', 'Amora', 'Lola'] } ``` **-> Acessando valores** ```js myObj["idade"] // resultado: 28 myObj.primeiroNome // resultado: "Lays" ``` **-> retorna array com todas as chaves (keys)** ```js Object.keys(myObj) ["primeiroNome", "ultimoNome", "idade", "pets"] Object.getOwnPropertyNames(myObj) // resultado: ["primeiroNome", "ultimoNome", "idade", "pets"] ``` **-> retorna array com todos os valores (values)** ```js Object.values(myObj) // resultado: ["Lays", "Hidani", 28, Array(3)] ``` **-> Verifica a existência de uma chave/propriedade no objeto** ```js myObj.hasOwnProperty('primeiroNome', idade) // resultado: true 'primeiroNome' in myObj // resultado: true ``` --- # Arrow function Sintaxe: ```js parametros => retorno ``` Exemplos: ```js const exemplo = (x, y) => x + y; const exemplo2 = () => 'Hello'; console.log(exemplo2) // Hello const exemplo3 = text => text ``` --- # JS WEB - Mudar o conteúdo do HTML - Mudar os valores de atributo do HTML - Mudar o estilo CSS - Mostrar e Esconder elementos no HTML # DOM (document object model) ## Obter/selecionar elementos do HTML Há duas formas de selecionar elementos: - getElement - querySelector ### getElement - document.getElementById('id'): obtem o elemento através do id - document.getElementByClass('class'): obtem o elemento através da classe - document.getElementsByName('name'): obtem o elemento através do nome - document.getElementsByTagName('tag'): obtem o elemento através da tag ### QuerySelector Usa os símbolos **#** e **.** assim como o CSS: - documento.querySelector("#id"): obtem o elemento através do id - documento.querySelector(".class"): obtem o elemento através da classe - documento.querySelectorAll("elemento"): obtem todos os elementos com essa tag ## Template Literals (conhecidos como Template string antes do ES6) Templates literals são strings que permitem expressões embutidas. Uma forma de misturar texto (string) comum e variáveis de JS, por exemplo. - Template Literals utiliza acentos graves (**`**) para indicar o início e o fim do código que deverá ser inserido. - podemos inserir expressões que serão substituídas por seu resultado dentro do Template Literals, utilizando **placeholders**: ```js ${expressão} ``` Exemplo: ```js let x = 100; let y = 50; console.log(`O resultado de ${x} + ${y} = ${x + y}`) // resultado: O resultado de 100 + 50 = 150 ``` ## Inserir valor no HTML através de innerHTML e Template Literals > A propriedade innerHTML retorna o texto, incluindo todas as tags de espaçamento e elemento interno. [-w3schools](https://www.w3schools.com/jsref/prop_node_textcontent.asp) **Exemplo** **HMTL** ```html <p>Bem vindo!</p> ``` **JS** (obtém o valor) Primeiro, seleciona o elemento do HTML. No caso, obtem-se a entrada/input do usuário através do prompt e guarda na variável `name`: ```js var name = prompt("Olá, qual é o seu nome?"); ``` (diz onde quer inserir o valor) Em seguida, seleciona o elemento do HTML onde será inserida a variável `name`: ```js var welcome = document.querySelector("#user-name"); ``` (insere o valor) Então, utiliza-se o `innerHTML`, para inserir no HTML o valor da variável `name`: ```js welcome.innerHTML = ` <p> Olá, ${name}. </p> ` ``` ## Modificar o conteúdo/texto (textContent) > A propriedade textContent retorna o texto com espaçamento, mas sem tags de elementos internos. [-w3schools](https://www.w3schools.com/jsref/prop_node_textcontent.asp) **HTML:** ```html <p id="hello"></p> ``` **JS:** A frase abaixo, será inserida entre as tags `<p>` de id **hello**. ```js let getP = document.querySelector("#hello"); p.textContent = `Olá, ${name}. Seja bem vindo!`; ``` ## Obter valor de input (.value) **importante: costuma-se nomear com $ no início todas as variáveis no js que têm valores com origem do HTML** **exemplo** HTML: ```html <input id="name"></input> ``` JS: ```js var $name = document.getElementById("name").value ``` *o valor inserido no input com id `name` será armazenado na variável name* * Adicionar ação ao clicar: ```html <p onclick = "função ()">Clique aqui</p> ``` ``` document.getElementById("p")[0] ----> p índice 0 ----> [p, p, p] ``` ## Obter valor de option (value="") Usando `<select>` e `<option>`, para saber o valor selecionado, podemos inserir `value="valor"` em cada `<option>`. HTML: ```html <select> <option value="A">A</option> <option value="B">B</option> <option value="C">C</option> </select> ``` ## Difinir ou retornar o valor de `<option>` (selectedIndex) A propriedade selectedIndex define ou retorna o índice da opção selecionada em uma lista suspensa. Imagine que queremos definir o valor do `value` de um `<select>` para que ele retorne à um padrão inicial: ```js typeMenu.selectedIndex = "type"; ``` ## Method: addEventListener() Como o próprio nome diz, esse método fica 'escutando' tudo o que acontece na página, e 'dispaara' / executa determinada função quando determinado evento ocorre. **sintaxe** ```js addEventListener(event, function, useCapture) ``` *useCapture é opcional, valor booleano* *false- Default. O manipulador de eventos é executado na fase de bubbling* *true - O manipulador de eventos é executado na fase de captura* ### events types [Acesse MDN para lista completa](https://developer.mozilla.org/pt-BR/docs/Web/Events) Mais comuns: - 'click': execulta a função quando elemento é clicado (botão, por exemplo) - 'input': execulta a função após inserção de valor (quando algo é digitado em um input, por exemplo) - 'change': execulta a função após mudança (quando selecionamos uma opção em um `select`, por exemplo) **exemplo** ```html No HTML: <button id="btn"></button> ``` ```js no JS: function hello() { console.log("Hello") } document.getElementById("btn").addEventListener("click", hello); ``` # Trabalhando com elementos no DOM [Excelente Artigo: Mastering the DOM](https://medium.com/re-dom/master-the-dom-bc1a2a06089b) ## Criar elementos (createElement) Sintaxe: ```js document.createElement(tagName) ``` Exemplo: Criamos um elemento de tag `<p>` e associamos à variável p. ```js let p = document.createElement("p"); ``` ## Definir um atributo (setAttribute) Sintaxe: ```js elemento.setAttribute("nomeDoAtributo", "valorDoAtributo") ``` Usando o exemplo anterior: Atribuímos uma classe css de valor "hello" à tag `<p>` criada anteriormente. ```js p.setAttribute("class", "hello"); ``` ## Remover um atributo (removeAttribute) Sintaxe: ```js elemento.removeAttribute("nomeDoAtributo", "valorDoAtributo") ``` ## Outra forma de denifir classes (classList.add) Outra forma de fazer o exemplo anterior seria: ```js p.classList.add("hello"); ``` ## Remover uma classe (classList.remove) Sintaxe: ```js p.classList.remove("hello"); ``` ## Anexar elementos à elementos já existentes (appendChild) Sintaxe: ```js document.parentName.appendChild(child); ``` Exemplo: ```js document.body.appendChild("p"); ``` ## Remover elementos de elementos já existentes (removeChild) Da mesma forma que podemos anexar elementos filhos, também podemos removê-los: Sintaxe: ```js document.parentName.removeChild(child); ```