May 11, 2023

Javascript (Essencial para Frameworks)

Arrays (map, filter, reduce)

map, reduce e filter são métodos nativos de arrays do JavaScript que permitem manipular os dados de um array de forma eficiente. A seguir, explico como cada um deles funciona:

map: O método map cria um novo array a partir de um array existente, aplicando uma função de transformação em cada elemento. A função de transformação recebe como argumento cada elemento do array original e deve retornar um novo valor que será incluído no novo array. O novo array gerado terá o mesmo número de elementos que o array original. Exemplo:

const numeros = [1, 2, 3, 4, 5];

const dobrados = numeros.map(function(numero) {
  return numero * 2;
});

console.log(dobrados); // [2, 4, 6, 8, 10]

Nesse exemplo, o método map é aplicado ao array numeros, e para cada elemento é aplicada a função de transformação que multiplica o elemento por 2. O resultado é um novo array com os valores dobrados.

reduce: O método reduce aplica uma função de acumulação em cada elemento do array, a partir do primeiro elemento até o último. A função de acumulação recebe dois argumentos: um acumulador e um valor atual. O acumulador é o valor retornado pela função de acumulação na iteração anterior, ou o valor inicial especificado como segundo argumento do método reduce. O valor atual é o valor do elemento atual do array. A função de acumulação deve retornar o valor que será usado como acumulador na próxima iteração. Ao final do processo, o valor retornado pela última iteração é o valor final do método reduce. Exemplo:

const numeros = [1, 2, 3, 4, 5];

const soma = numeros.reduce(function(acumulador, numero) {
  return acumulador + numero;
}, 0);

console.log(soma); // 15

Nesse exemplo, o método reduce é aplicado ao array numeros, e a função de acumulação é uma simples soma dos valores. O valor inicial do acumulador é zero, e na primeira iteração o valor atual é 1. A função de acumulação retorna a soma do acumulador (zero) com o valor atual (1), que é 1. Na próxima iteração, o acumulador é 1 e o valor atual é 2, resultando em um acumulador de valor 3. O processo continua até a última iteração, quando o acumulador tem valor 15.

filter: O método filter cria um novo array a partir de um array existente, incluindo apenas os elementos que atendem a uma determinada condição. A condição é especificada por uma função que é aplicada em cada elemento do array. A função deve retornar um valor booleano: true para incluir o elemento no novo array ou false para excluí-lo. Exemplo:

const numeros = [1, 2, 3, 4, 5];

const pares = numeros.filter(function(numero) {
  return numero % 2 === 0;
});

console.log(pares); // [2, 4]

Nesse exemplo, o método filter é aplicado ao array numeros, e a função de filtro é uma verificação se o número é par (o resto da divisão por 2 é zero).

Objetos

Objetos são estruturas de dados complexas em JavaScript que podem armazenar múltiplos valores e métodos em uma única variável. Eles são usados para modelar entidades do mundo real ou para agrupar dados relacionados.

Em JavaScript, objetos são criados usando a sintaxe de chaves ({}) e podem ter várias propriedades e valores. Por exemplo:

let pessoa = {
  nome: "João",
  idade: 30,
  cidade: "São Paulo"
};

Nesse exemplo, pessoa é um objeto com três propriedades: nome, idade e cidade.

Para acessar ou modificar as propriedades de um objeto, podemos usar a notação de ponto ou a notação de colchetes. Por exemplo:

console.log(pessoa.nome); // "João"
pessoa.idade = 31;
console.log(pessoa["cidade"]); // "São Paulo"

Também é possível adicionar ou remover propriedades de um objeto dinamicamente usando a mesma notação de ponto ou colchetes. Por exemplo:

pessoa.profissao = "Programador";
delete pessoa.cidade;

Os objetos também podem ter métodos, que são funções que são armazenadas como propriedades. Por exemplo:

let pessoa = {
  nome: "João",
  idade: 30,
  cidade: "São Paulo",
  saudacao: function() {
    console.log("Olá, meu nome é " + this.nome + " e tenho " + this.idade + " anos.");
  }
};

pessoa.saudacao(); // "Olá, meu nome é João e tenho 30 anos."

Em resumo, os objetos são estruturas de dados fundamentais em JavaScript que permitem agrupar e manipular dados relacionados. Eles podem ter propriedades e métodos, e podem ser criados, acessados e modificados usando a notação de ponto ou colchetes.

Arrow Functions

Arrow functions são uma forma mais curta e concisa de escrever funções no JavaScript. Elas foram introduzidas no ECMAScript 6 e são uma alternativa para a sintaxe tradicional de declaração de funções.

A principal diferença entre as arrow functions e as funções tradicionais é a sintaxe. Em vez de usar a palavra-chave "function", as arrow functions são definidas usando uma seta (=>). Além disso, as arrow functions não criam um novo contexto de "this" quando são chamadas, o que pode ser útil em algumas situações.

Aqui está um exemplo de uma função tradicional e sua equivalente como arrow function:

// Função tradicional
function soma(a, b) {
  return a + b;
}

// Arrow function equivalente
const soma = (a, b) => a + b;

As arrow functions podem ter diferentes formas dependendo do número de parâmetros e do que é retornado. Veja alguns exemplos:

// Arrow function sem parâmetros
const hello = () => console.log("Olá!");

// Arrow function com um parâmetro
const dobro = (x) => x * 2;

// Arrow function com mais de um parâmetro
const soma = (a, b) => a + b;

// Arrow function com bloco de código
const isPositive = (number) => {
  if (number > 0) {
    return true;
  } else {
    return false;
  }
};

Callbacks

Callbacks são funções que são passadas como argumentos para outras funções em JavaScript. Essas funções são chamadas de volta (daí o nome "callback") após a execução da função principal.

Com o uso de callbacks, é possível escrever código mais flexível e modular, separando as tarefas em funções específicas que podem ser reutilizadas em diferentes partes do código. As callbacks também são uma maneira de lidar com erros em funções assíncronas, permitindo que o código se adapte a diferentes cenários de erro.

As callbacks são comuns em funções assíncronas, onde é necessário esperar a execução de uma tarefa antes de continuar com o restante do código. Por exemplo, em uma requisição AJAX, é possível passar uma função callback para ser executada quando a resposta da requisição estiver disponível.

Um exemplo prático e comum de uso de callbacks é a utilização de funções como parâmetros em outras funções.

Vamos imaginar uma função chamada somar, que recebe dois números como parâmetros e retorna a soma entre eles:

function somar(a, b) {
  return a + b;
}

Agora, vamos criar uma outra função chamada calcular que recebe três parâmetros: dois números e uma função. Essa função será usada para realizar um cálculo entre os dois números passados como parâmetro.

function calcular(a, b, operacao) {
  return operacao(a, b);
}

Note que o terceiro parâmetro é uma função, que será usada para realizar a operação entre a e b. Essa função é chamada de callback.

Agora, vamos criar algumas funções que serão usadas como callbacks na função calcular:

function multiplicar(a, b) {
  return a * b;
}

function subtrair(a, b) {
  return a - b;
}

Agora, podemos chamar a função calcular passando como terceiro parâmetro uma das funções que acabamos de criar:

calcular(5, 3, somar); // retorna 8
calcular(5, 3, multiplicar); // retorna 15
calcular(5, 3, subtrair); // retorna 2

Repare que estamos passando as funções somar, multiplicar e subtrair como parâmetro para a função calcular, e cada uma delas será usada como callback para realizar uma operação específica. Esse é um exemplo simples e prático de como utilizar callbacks em funções do JavaScript.

Destructuring

Destructuring em português seria "Destruturação". É uma técnica que permite extrair dados de uma estrutura de dados complexa, como um objeto ou array, e atribuí-los a variáveis individuais de forma mais fácil e concisa.

Destructuring é uma funcionalidade do JavaScript que permite extrair valores de objetos ou arrays em variáveis distintas, de maneira mais concisa e legível. Com ele, podemos atribuir valores a variáveis de forma mais simples, sem a necessidade de escrever várias linhas de código.

Por exemplo, considerando o objeto:

const pessoa = {
  nome: 'João',
  idade: 25,
  cidade: 'São Paulo'
}

Podemos extrair os valores das propriedades em variáveis distintas usando o Destructuring:

const { nome, idade, cidade } = pessoa;

Dessa forma, a variável nome receberá o valor 'João', a variável idade receberá o valor 25 e a variável cidade receberá o valor 'São Paulo'.

Além disso, é possível utilizar o Destructuring em arrays também:

const numeros = [1, 2, 3, 4, 5];
const [primeiro, segundo, ...resto] = numeros;

Neste exemplo, a variável primeiro receberá o valor 1, a variável segundo receberá o valor 2, e a variável resto será um array contendo os valores [3, 4, 5].

O Destructuring é uma funcionalidade muito útil para simplificar o código e torná-lo mais legível, principalmente em situações em que é necessário acessar muitas propriedades de um objeto ou muitos elementos de um array. Outro exemplo mais simples seria:

const produtos = ['Agua', 'Refri', 'Cerveja', 'Suco', 'Limonada']
const [p4] = produtos;
console.log(p4);

Modules

Modules, em JavaScript, são uma forma de organizar o código em módulos separados e reutilizáveis. Eles permitem dividir o código em partes menores, facilitando a manutenção, o desenvolvimento colaborativo e a legibilidade do código.

O suporte a módulos foi adicionado ao JavaScript no ECMAScript 6, e a maneira padrão de criar um módulo é usar a sintaxe export e import. O export é usado para exportar um valor de um módulo, enquanto o import é usado para importar um valor de outro módulo.

Por exemplo, considere o seguinte módulo que define uma função saudacao e exporta essa função:

// módulo de saudação
export function saudacao(nome) {
  console.log(`Olá, ${nome}!`);
}

Agora, para usar essa função em outro módulo, podemos importá-la usando a seguinte sintaxe:

import { saudacao } from './saudacao.js';

saudacao('João'); // output: Olá, João!

Neste exemplo, o módulo saudacao exporta a função saudacao usando a palavra-chave export. O módulo saudacao é importado no outro módulo usando a palavra-chave import.

É importante notar que os módulos no JavaScript são carregados de forma assíncrona, o que significa que a execução do código não é bloqueada enquanto o módulo é carregado. Isso é diferente do carregamento de scripts no HTML, onde o carregamento é síncrono e pode bloquear a execução do código.

Além disso, os módulos no JavaScript possuem escopo próprio, o que significa que as variáveis e funções definidas em um módulo não são acessíveis em outros módulos, a menos que sejam exportadas. Isso ajuda a evitar conflitos de nomes e a manter a integridade do código.

Em resumo, os módulos no JavaScript são uma forma de organizar e compartilhar código de forma clara e reutilizável. Eles ajudam a tornar o código mais modular, legível e fácil de manter.

Fetch

O fetch é uma função nativa do JavaScript para fazer requisições HTTP assíncronas. Ela é usada para buscar recursos de um servidor, como dados em formato JSON ou imagens, e obter a resposta em formato de objeto Response. O fetch é uma alternativa moderna ao antigo objeto XMLHttpRequest.

Para utilizar o fetch, basta chamar a função passando a URL do recurso desejado como parâmetro. É possível também passar um segundo parâmetro opcional, um objeto de opções para configurar a requisição, como o método HTTP a ser utilizado, os cabeçalhos da requisição, o corpo da requisição, entre outras opções.

Um exemplo simples de uso do fetch seria o seguinte:

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

Nesse exemplo, a função fetch é usada para buscar os dados da API em formato JSON, e depois os dados são convertidos em objeto JavaScript com o método json() da resposta. Em seguida, é feito o log dos dados no console. O método catch() é usado para capturar erros na requisição.

O fetch retorna uma promessa (promise), o que permite o uso do método then() para manipular a resposta da requisição quando ela estiver disponível. Isso torna a requisição assíncrona e evita bloquear a thread principal do JavaScript, permitindo que o usuário continue a interagir com a página enquanto a requisição está sendo processada.

Uma Promise em JavaScript é um objeto que representa um valor que pode estar disponível agora, no futuro ou nunca. Ela é utilizada para trabalhar com operações assíncronas, como requisições HTTP ou operações que levam tempo para serem concluídas.

Uma Promise tem três estados possíveis:

  • Pending: quando ainda está sendo processada;
  • Fulfilled: quando a operação assíncrona foi concluída com sucesso e o valor resultante está disponível;
  • Rejected: quando ocorre um erro durante o processamento da operação assíncrona.

O uso de Promises permite que o código assíncrono seja tratado de forma mais elegante, com uma sintaxe mais simples e fácil de entender. Além disso, permite o encadeamento de várias operações assíncronas de forma mais clara, através do uso de métodos como then() e catch().

Por exemplo, ao realizar uma requisição HTTP utilizando fetch, é retornada uma Promise que pode ser tratada utilizando os métodos then() e catch().

API significa Application Programming Interface, e pode ser definida como um conjunto de rotinas, protocolos e ferramentas para acesso a um sistema externo, seja ele um software, hardware ou serviço web. Em outras palavras, uma API é uma interface que permite a comunicação entre diferentes sistemas.

JSON significa JavaScript Object Notation, é uma forma leve de armazenar e transmitir dados em formato texto. É muito utilizado em APIs para transferência de dados entre diferentes sistemas, pois é fácil de ler e escrever, além de ser compatível com diversas linguagens de programação.

Em resumo, uma API é uma forma de disponibilizar funcionalidades e dados de um sistema para que possam ser utilizados por outros sistemas, enquanto o JSON é um formato de dados muito utilizado para a troca de informações entre diferentes sistemas por meio de uma API.

Referencias:

https://www.alura.com.br/artigos/manipulacao-de-array-com-map-filter-e-reduce?gclid=EAIaIQobChMIlJaV_Jbu_gIVPS-tBh2kdgW-EAAYASAAEgJJZ_D_BwE

https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/JSON

https://medium.com/trainingcenter/objetos-em-javascript-parte-1-24a377dff76a