Skip to content

Javascript Syntax Cheat Sheet

Cookies, LocalStorage, SessionStorage

storage

localSotrage.setItem("name", "alex");
localSotrage.getItem("name"); // alex
localStorage.removeItem("name");
localStorage.clear();

sessionStorage.setItem("name", "John");
sessionStorage.getItem("name"); // John
sessionStorage.removeItem("name");
sessionStorage.clear();

document.cookie = `name=Bob; expires=${new Date(2021, 0, 1).toUTCString()}`;
console.log(document.cookie);

Stackoverflow

function f() {
	return f();
}

f();

Arrays (under the hood) Fast Reference

function forEach(array, cb) {
	for (let i = 0; i < array.length; i++) {
		cb(array[i], i, array);
	}
}

function map(array, cb) {
	const newArray = [];
	for (let i = 0; i < array.length; i++) {
		newArray.push(cb(array[i], i, array));
	}

	return newArray;
}

function filter(array, cb) {
	const newArray = [];
	for (let i = 0; i < array.length; i++) {
		const element = array[i];
		if (cb(element, i, array)) newArray.push(element);
	}

	return newArray;
}

function reduce(array, cb, initialValue) {
	let currentValue = initialValue;
	for (let i = 0; i < array.length; i++) {
		const element = array[i];
		if (initialValue == null && i === 0) {
			currentValue = element;
		} else {
			currentValue = cb(currentValue, element, i, array);
		}
	}

	return currentValue;
}

function some(array, cb) {
	for (let i = 0; i < array.length; i++) {
		if (cb(array[i], i, array)) return true;
	}

	return false;
}

function every(array, cb) {
	for (let i = 0; i < array.length; i++) {
		if (!cb(array[i], i, array)) return false;
	}

	return true;
}

function flat(array, depth = 1) {
	const newArray = [];
	for (let i = 0; i < array.length; i++) {
		const element = array[i];
		if (Array.isArray(element) && depth > 0) {
			newArray.push(...flat(element, depth - 1));
		} else {
			newArray.push(element);
		}
	}
	return newArray;
}

function find(array, cb) {
	for (let i = 0; i < array.length; i++) {
		const element = array[i];
		if (cb(element, i, array)) return element;
	}
}

JavaScript Básico

var nome = 'André';
let idade = 28;
const possuiFaculdade = true;
COPIAR
EVITAM REPETIÇÕES
DRY (Don't repeat yourself)

var preco = 20;
var totalComprado = 5;
var precoTotal = preco * totalComprado;
var nome = "André";
var idade = 28;
var possuiFaculdade = true;
var nome = "André",
	idade = 28,
	possuiFaculdade = true;
var precoAplicativo;
// retorna undefined
NOME
// Inválido
var §nome;
var function;
var 1possuiFaculdade;

// Válido
var $selecionar;
var _nome;
var possuiFaculdadeNoExterior;
console.log(nome);
// retorna nome is not defined
console.log(nome);
var nome = "André";
// Retorna undefined

var profissao = "Designer";
console.log(profissao);
// Retornar Designer
var idade = 28;
idade = 29;

let preco = 50;
preco = 25;

const possuiFaculdade = true;
possuiFaculdade = false;
// Retorna um erro
var nome = "André"; // String
var idade = 28; // Number
var possuiFaculdade = true; // Boolean
var time; // Undefined
var comida = null; // Null
var simbolo = Symbol(); // Symbol
var novoObjeto = {}; // Object
VERIFICAR TIPO DE DADO
var nome = 'André';
console.log(typeof nome);
// retorna string
var nome = "André";
var sobrenome = "Rafael";
var nomeCompleto = nome + " " + sobrenome;
var gols = 1000;
var frase = 'Romário fez ' + gols + ' gols';
COPIAR
ASPAS DUPLAS, SIMPLES E TEMPLATE STRING
'JavaScript é "super" fácil';
"JavaScript é 'super' fácil";
"JavaScript é \"super\" fácil";
`JavaScript é "super" fácil"`;
"JavaScript é "super" fácil"; // Inválido
var gols = 1000;
var frase1 = "Romário fez " + gols + " gols";
var frase2 = `Romário fez ${gols} gols`; // Utilizando Template String

JavaScript Assíncrono

const promessa = new Promise(function (resolve, reject) {
	let condicao = true;
	if (condicao) {
		resolve();
	} else {
		reject();
	}
});

console.log(promessa); // Promise {<resolved>: undefined}
const promessa = new Promise(function (resolve, reject) {
	let condicao = true;
	if (condicao) {
		resolve("Estou pronto!");
	} else {
		reject();
	}
});

console.log(promessa); // Promise {<resolved>: "Estou pronto!"}
const promessa = new Promise(function (resolve, reject) {
	let condicao = false;
	if (condicao) {
		resolve("Estou pronto!");
	} else {
		reject(Error("Um erro ocorreu."));
	}
});

console.log(promessa); // Promise {<rejected>: Error:...}
const promessa = new Promise(function (resolve, reject) {
	let condicao = true;
	if (condicao) {
		resolve("Estou pronto!");
	} else {
		reject(Error("Um erro ocorreu."));
	}
});

promessa.then(function (resolucao) {
	console.log(resolucao); // 'Estou pronto!'
});
const promessa = new Promise((resolve, reject) => {
	setTimeout(() => {
		resolve("Resolvida");
	}, 1000);
});

promessa.then(resolucao => {
	console.log(resolucao); // 'Resolvida' após 1s
});
const promessa = new Promise((resolve, reject) => {
	resolve("Etapa 1");
});

promessa
	.then(resolucao => {
		console.log(resolucao); // 'Etapa 1';
		return "Etapa 2";
	})
	.then(resolucao => {
		console.log(resolucao); // 'Etapa 2';
		return "Etapa 3";
	})
	.then(r => r + 4)
	.then(r => {
		console.log(r); // Etapa 34
	});
const promessa = new Promise((resolve, reject) => {
	let condicao = false;
	if (condicao) {
		resolve("Estou pronto!");
	} else {
		reject(Error("Um erro ocorreu."));
	}
});

promessa
	.then(resolucao => {
		console.log(resolucao);
	})
	.catch(reject => {
		console.log(reject);
	});
const promessa = new Promise((resolve, reject) => {
	let condicao = false;
	if (condicao) {
		resolve("Estou pronto!");
	} else {
		reject(Error("Um erro ocorreu."));
	}
});

promessa.then(
	resolucao => {
		console.log(resolucao);
	},
	reject => {
		console.log(reject);
	}
);
const promessa = new Promise((resolve, reject) => {
	let condicao = false;
	if (condicao) {
		resolve("Estou pronto!");
	} else {
		reject(Error("Um erro ocorreu."));
	}
});

promessa
	.then(
		resolucao => {
			console.log(resolucao);
		},
		reject => {
			console.log(reject);
		}
	)
	.finally(() => {
		console.log("Acabou"); // 'Acabou'
	});
const login = new Promise(resolve => {
	setTimeout(() => {
		resolve("Login Efetuado");
	}, 1000);
});
const dados = new Promise(resolve => {
	setTimeout(() => {
		resolve("Dados Carregados");
	}, 1500);
});

const tudoCarregado = Promise.all([login, dados]);

tudoCarregado.then(respostas => {
	console.log(respostas); // Array com ambas respostas
});
const login = new Promise(resolve => {
	setTimeout(() => {
		resolve("Login Efetuado");
	}, 1000);
});
const dados = new Promise(resolve => {
	setTimeout(() => {
		resolve("Dados Carregados");
	}, 1500);
});

const carregouPrimeiro = Promise.race([login, dados]);

carregouPrimeiro.then(resposta => {
	console.log(resposta); // Login Efetuado
});
fetch("./arquivo.txt").then(function (response) {
	console.log(response); // Response HTTP (Objeto)
});
fetch("./arquivo.txt")
	.then(function (response) {
		return response.text();
	})
	.then(function (corpo) {
		console.log(corpo);
	});
fetch("c:/files/arquivo.txt")
	.then(response => {
		return response.text();
	})
	.then(corpo => {
		console.log(corpo);
	}); // erro
fetch("https://viacep.com.br/ws/01001000/json/")
	.then(response => response.json())
	.then(cep => {
		console.log(cep.bairro, cep.logradouro);
	});
const styleElement = document.createElement("style");

fetch("./style.css")
	.then(response => response.text())
	.then(style => {
		styleElement.innerHTML = style;
		document.body.appendChild(styleElement);
	});
const div = document.createElement("div");

fetch("./sobre.html")
	.then(response => response.text())
	.then(htmlBody => {
		div.innerHTML = htmlBody;
		const titulo = div.querySelector("h1");
		document.querySelector("h1").innerText = titulo.innerText;
	});
const div = document.createElement("div");

fetch("./imagem.png")
	.then(response => response.blob())
	.then(imgBlob => {
		const blobUrl = URL.createObjectURL(imgBlob);
		console.log(blobUrl);
	});
const div = document.createElement("div");

fetch("https://viacep.com.br/ws/01001000/json/").then(response => {
	const cloneResponse = response.clone();
	response.json().then(json => {
		console.log(json);
	});
	cloneResponse.text().then(text => {
		console.log(text);
	});
});
const div = document.createElement("div");

fetch("https://viacep.com.br/ws/01001000/json/").then(response => {
	response.headers.forEach(console.log);
});
const div = document.createElement("div");

fetch("https://viacep.com.br/ws/01001000/json/").then(response => {
	console.log(response.status, response.ok);
	if (response.status === 404) {
		console.log("Página não encontrada");
	}
});
const div = document.createElement("div");

fetch("https://viacep.com.br/ws/01001000/json/").then(response => {
	console.log(response.type, response.url);
});

//types
// basic: feito na mesma origem
// cors: feito em url body pode estar disponível
// error: erro de conexão
// opaque: no-cors, não permite acesso de outros sites
{
	"id": 1,
	"nome": "Andre",
	"email": "andre@origamid.com"
}
{
	"id": 1,
	"faculdade": true,
	"pertences": ["lapis", "caneta", "caderno"],
	"endereco": {
		"cidade": "Rio de Janeiro",
		"pais": "Brasil"
	},
	"casado": null
}
[
	{
		"id": 1,
		"aula": "JavaScript",
		"tempo": "25min"
	},
	{
		"id": 2,
		"aula": "HTML",
		"tempo": "15min"
	},
	{
		"id": 3,
		"aula": "CSS",
		"tempo": "10min"
	}
]
const textoJSON = '{"id": 1, "titulo": "JavaScript", "tempo": "25min"}';
const textoOBJ = JSON.parse(textoJSON);

const enderecoOBJ = {
	cidade: "Rio de Janeiro",
	rua: "Ali Perto",
	pais: "Brasil",
	numero: 50,
};
const enderecoJSON = JSON.stringfy(enderecoOBJ);
const configuracoes = {
	player: "Google API",
	tempo: 25.5,
	aula: "2-1 JavaScript",
	vitalicio: true,
};

localStorage.configuracoes = JSON.stringify(configuracoes);
const pegarConfiguracoes = JSON.parse(localStorage.configuracoes);

APIs

fetch("https://pokeapi.co/api/v2/pokemon/")
	.then(r => r.json())
	.then(pokemon => {
		console.log(pokemon);
	});
const url = 'https://jsonplaceholder.typicode.com/posts/';
const options = {
  method: 'POST',
  headers: {
    "Content-Type": "application/json; charset=utf-8",
  },
  body: '"aula": "JavaScript"';
}

fetch(url, options);
.then(response => response.json())
.then(json => {
  console.log(json);
});
const url = "https://jsonplaceholder.typicode.com/posts/";
fetch(url, {
	method: "GET",
})
	.then(r => r.json())
	.then(r => console.log(r));
const url = "https://jsonplaceholder.typicode.com/posts/";

fetch(url, {
	method: "POST",
	headers: {
		"Content-Type": "application/json; charset=utf-8",
	},
	body: '{"titulo": "JavaScript"}',
})
	.then(r => r.json())
	.then(r => console.log(r));
const url = "https://jsonplaceholder.typicode.com/posts/1/";

fetch(url, {
	method: "PUT",
	headers: {
		"Content-Type": "application/json; charset=utf-8",
	},
	body: '{"titulo": "JavaScript"}',
})
	.then(r => r.json())
	.then(r => console.log(r));
const url = "https://jsonplaceholder.typicode.com/posts/1/";

fetch(url, {
	method: "HEAD",
}).then(response => {
	response.headers.forEach(console.log);
	console.log(response.headers.get("Content-Type"));
});
const url = "https://cors-anywhere.herokuapp.com/https://www.google.com/";
const div = document.createElement("div");

fetch(url)
	.then(r => r.text())
	.then(r => {
		div.innerHTML = r;
		console.log(div);
	});
async function puxarDados() {
	const dadosResponse = await fetch("./dados.json");
	const dadosJSON = await dadosResponse.json();

	document.body.innerText = dadosJSON.titulo;
}

puxarDados();
function iniciarFetch() {
	fetch("./dados.json")
		.then(dadosResponse => dadosResponse.json())
		.then(dadosJSON => {
			document.body.innerText = dadosJSON.titulo;
		});
}
iniciarFetch();

async function iniciarAsync() {
	const dadosResponse = await fetch("./dados.json");
	const dadosJSON = await dadosResponse.json();
	document.body.innerText = dadosJSON.titulo;
}
iniciarAsync();
async function puxarDados() {
	try {
		const dadosResponse = await fetch("./dados.json");
		const dadosJSON = await dadosResponse.json();
		document.body.innerText = dadosJSON.titulo;
	} catch (erro) {
		console.log(erro);
	}
}
puxarDados();
async function iniciarAsync() {
  const dadosResponse = fetch('./dados.json');
  const clientesResponse = fetch('./clientes.json');

  // ele espera o que está dentro da expressão () ocorrer primeiro
  const dadosJSON = await (await dadosResponse).json();
  const clientesJSON = await (await clientesResponse).json();
}
iniciarAsync();
async function asyncSemPromise() {
	// Console não irá esperar.
	await setTimeout(() => console.log("Depois de 1s"), 1000);
	console.log("acabou");
}
asyncSemPromise();

async function iniciarAsync() {
	await new Promise(resolve => {
		setTimeout(() => resolve(), 1000);
	});
	console.log("Depois de 1s");
}
iniciarAsync();
window.history;
window.history.back(); // vai para a anterior
window.history.forward(); // vai para a próxima

// Em obj podemos enviar um objeto com dados // mas o seu uso é restrito por isso geralmente utilizamos // null. O title ainda é ignorado por alguns browsers, também // utilizamos null nele. O url que é parte importante.

window.history.pushState(null, null, ‘sobre.html’); “

Classes e Objetos

function Button(text, background) {
	this.text = text;
	this.background = background;
}

Button.prototype.element = function () {
	const buttonElement = document.createElement("button");
	buttonElement.innerText = this.text;
	buttonElement.style.background = this.background;
	return buttonElement;
};

const blueButton = new Button("Comprar", "blue");
class Button {
	constructor(text, background) {
		this.text = text;
		this.background = background;
	}
	element() {
		const buttonElement = document.createElement("button");
		buttonElement.innerText = this.text;
		buttonElement.style.background = this.background;
		return buttonElement;
	}
}

const blueButton = new Button("Comprar", "blue");
class Button {
	constructor(propriedade) {
		this.propriedade = propriedade;
	}
	metodo1() {}
	metodo2() {}
}

function Button(propriedade) {
	this.propriedade = propriedade;
}
Button.prototype.metodo1 = function () {};
Button.prototype.metodo1 = function () {};
class Button {
	constructor(text, background, color) {
		this.text = text;
		this.background = background;
		this.color = color;
	}
}

const blueButton = new Button("Clique", "blue", "white");
// Button {text: 'Clique', background: 'blue', color: 'white'}
class Button {
	constructor(text) {
		this.text = text;
		return this.element(); // não fazer
	}
	element() {
		document.createElement("button").innerText = this.text;
	}
}

const btn = new Button("Clique");
// <button>Clique</button>
class Button {
	constructor(text) {
		this.text = text;
	}
	element() {
		const buttonElement = document.createElement("button");
		buttonElement.innerText = this.text;
		return buttonElement;
	}
	appendElementTo(target) {
		const targetElement = document.querySelector(target);
		targetElement.appendChild(this.element());
	}
}

const blueButton = new Button("Clique");
blueButton.appendElementTo("body");
class Button {
	constructor(options) {
		this.options = options;
	}
}

const blueOptions = {
	backgroundColor: "blue",
	color: "white",
	text: "Clique",
	borderRadius: "4px",
};

const blueButton = new Button(blueOptions);
blueButton.options;
class Button {
	constructor(text) {
		this.text = text;
	}
	static create(background) {
		const elementButton = document.createElement("button");
		elementButton.style.background = background;
		elementButton.innerText = "Clique";
		return elementButton;
	}
}

const blueButton = Button.create("blue");
class Button {
	constructor(text, background) {
		this.text = text;
		this.background = background;
	}
	element() {
		const elementButton = document.createElement("button");
		elementButton.innerText = this.text;
		elementButton.style.background = this.background;
		return elementButton;
	}
	static createBlue(text) {
		return new Button(text, "blue");
	}
}

const blueButton = Button.createBlue("Comprar");
const button = {
  get element() {
    return this._element;
  }
  set element(tipo) {
    this._element = document.createElement(tipo);
  }
}

button.element = 'button'; // set
button.element; // get (<button></button>);
const matematica = {
	get PI() {
		return 3.14;
	},
};

matematica.PI; // get (3.14)
matematica.PI = 20; // nada acontece
const frutas = {
	lista: [],
	set nova(fruta) {
		this.lista.push(fruta);
	},
};

frutas.nova = "Banana";
frutas.nova = "Morango";
frutas.lista; // ['Banana', Morango];
class Button {
	constructor(text, color) {
		this.text = text;
		this.color = color;
	}
	get element() {
		const buttonElement = document.createElement("button");
		buttonElement.innerText = this.text;
		buttonElement.style.color = this.color;
		return buttonElement;
	}
}

const blueButton = new Button("Comprar", "blue");
blueButton.element; // retorna o elemento
class Button {
	constructor(text, color) {
		this.text = text;
		this.color = color;
	}
	get element() {
		const buttonElement = document.createElement("button");
		buttonElement.innerText = this.text;
		buttonElement.style.color = this.color;
		return buttonElement;
	}
}

const blueButton = new Button("Comprar", "blue");
blueButton.element; // retorna o elemento
class Button {
	constructor(text) {
		this.text = text;
	}
	get element() {
		const elementType = this._elementType || "button";
		const buttonElement = document.createElement(elementType);
		buttonElement.innerText = this.text;
		return buttonElement;
	}
	set element(type) {
		this._elementType = type;
	}
}

const blueButton = new Button("Comprar");
blueButton.element; // retorna o elemento
class Veiculo {
	constructor(rodas) {
		this.rodas = rodas;
	}
	acelerar() {
		console.log("Acelerou");
	}
}

class Moto extends Veiculo {
	empinar() {
		console.log("Empinou com " + this.rodas + " rodas");
	}
}

const honda = new Moto(2);
honda.empinar();
class Veiculo {
	constructor(rodas) {
		this.rodas = rodas;
	}
	acelerar() {
		console.log("Acelerou");
	}
}

class Moto extends Veiculo {
	acelerar() {
		console.log("Acelerou muito");
	}
}

const honda = new Moto(2);
honda.acelerar();
class Veiculo {
	constructor(rodas) {
		this.rodas = rodas;
	}
	acelerar() {
		console.log("Acelerou");
	}
}

class Moto extends Veiculo {
	acelerar() {
		super.acelerar();
		console.log("Muito");
	}
}

const honda = new Moto(2);
honda.acelerar();
class Veiculo {
	constructor(rodas, combustivel) {
		this.rodas = rodas;
		this.combustivel = combustivel;
	}
}

class Moto extends Veiculo {
	constructor(rodas, combustivel, capacete) {
		super(rodas, combustivel);
		this.capacete = capacete;
	}
}

const honda = new Moto(4, "Gasolina", true);
function somar(a,b) {
  return a + b;
}

somar(4,2); // 6
```js

- FUNCTION EXPRESSION
   - É criada a partir da declaração de uma variável, na qual assinalamos uma função. Esta função pode ser anônima ou nomeada. A mesma poderá ser ativada através da variável assinalada.
```js
const somar = function(a,b) {
  return a + b;
}

somar(4,2); // 6
somar(4, 2); // 6
dividir(4, 2); // Erro

function somar(a, b) {
	return a + b;
}
const dividir = function (a, b) {
	return a / b;
};
const somar = (a, b) => a + b;
somar(4, 2); // 6

const quadrado = a => a * a;
quadrado(4); // 16
// Declarada como método de window
// vaza o escopo de bloco, como se
// fosse criada utilizando var
function somar(a, b) {
	return a + b;
}
const dividir = (a, b) => a / b;

somar(4, 2);
dividir(4, 2);
var instrumento = "Violão";

(function () {
	// código isolado do escopo global
	var instrumento = "Guitarra";
	console.log(instrumento); // Guitarra
})();

console.log(instrumento); // Violão
const instrumento = "Violão";

(() => {
	const instrumento = "Guitarra";
	console.log(instrumento); // Guitarra
})();

console.log(instrumento); // Violão
// Remova o erro
priceNumber("R$ 99,99");
const priceNumber = n => +n.replace("R$", "").replace(",", ".");

// Crie uma IIFE e isole o escopo
// de qualquer código JS.

// Como podemos utilizar
// a função abaixo.
const active = callback => callback();
function createButton(text) {
	function element() {
		const buttonElement = document.createElement("button");
		buttonElement.innerText = text;
		return buttonElement;
	}
	return {
		element: element,
		text: text,
	};
}

const comprarBtn = createButton("Comprar");
function criarPessoa(nome, sobrenome) {
	const nomeCompleto = `${nome} ${sobrenome}`;

	function andar() {
		return `${nomeCompleto} andou`;
	}
	function nadar() {
		return `${nomeCompleto} nadou`;
	}
	return {
		nome,
		sobrenome,
		andar,
		nadar,
	};
}

const designer = criarPessoa("André", "Rafael");
"use strict";

function criarPessoa(nome, sobrenome) {
	const nomeCompleto = `${nome} ${sobrenome}`;
	function andar() {
		return `${nomeCompleto} andou`;
	}
	return Object.freeze({
		nome,
		sobrenome,
		andar,
	});
}

const designer = criarPessoa("André", "Rafael");
function Pessoa(nome) {
	if (!(this instanceof Pessoa))
		// ou (!new.target)
		return new Pessoa(nome);
	this.nome = nome;
}

Pessoa.prototype.andar = function () {
	return `${this.nome} andou`;
};

const designer = Pessoa("André");
function $$(selectedElements) {
	const elements = document.querySelectorAll(selectedElements);

	function on(onEvent, callback) {
		elements.forEach(element => {
			element.addEventListener(onEvent, callback);
		});
		return this; // retornar this irá funcionar da mesma forma
	}

	function hide() {
		elements.forEach(element => {
			element.style.display = "none";
		});
		return this;
	}

	function show() {
		elements.forEach(element => {
			element.style.display = "initial";
		});
		return this;
	}

	function addClass(className) {
		elements.forEach(element => {
			element.classList.add(className);
		});
		return this;
	}

	function removeClass(className) {
		elements.forEach(element => {
			element.classList.add(className);
		});
		return this;
	}

	return Object.freeze({
		elements,
		on,
		hide,
		show,
		addClass,
		removeClass,
	});
}

const buttons = $$("button");
buttons.hide().show().addClass("ativo").removeClass("ativo");

Clojures e Debugging

let item1 = 1;
function funcao1() {
	let item2 = 2;
	function funcao2() {
		let item3 = 3;
	}
}

// func1, possui acesso à
// item1 e item2

// func2, possui acesso à
// item1, item2 e item3
let item1 = 1;
function funcao1() {
	let item2 = 2;
	function funcao2() {
		let item3 = 3;
		console.log(item1);
		console.log(item2);
		console.log(item3);
	}
	funcao2();
}
debugger; // adicione a palavra debugger
let item1 = 1;
function funcao1() {
	let item2 = 2;
	function funcao2() {
		let item3 = 3;
		console.log(item1);
		console.log(item2);
		console.log(item3);
	}
	funcao2();
}
function contagem() {
	let total = 0;
	return function incrementar() {
		total++;
		console.log(total);
	};
}

const ativarIncrementar = contagem();
ativarIncrementar(); // 1
ativarIncrementar(); // 2
ativarIncrementar(); // 3
function $$(selectedElements) {
  const elements = document.querySelectorAll(selectedElements);

  function hide() { ... }
  function show() { ... }
  function on() { ... }
  function addClass() { ... }
  function removeClass() { ... }

  return { hide, show, on, addClass, removeClass }
}
const carro = {
	marca: "Fiat",
	ano: 2018,
	portas: 4,
};

const { marca, ano } = carro;

console.log(marca); // Fiat
console.log(ano); // 2018
const cliente = {
	nome: "Andre",
	compras: {
		digitais: {
			livros: ["Livro 1", "Livro 2"],
			videos: ["Video JS", "Video HTML"],
		},
		fisicas: {
			cadernos: ["Caderno 1"],
		},
	},
};

console.log(cliente.compras.digitais.livros);
console.log(cliente.compras.digitais.videos);

const { livros, videos } = cliente.compras.digitais;

console.log(livros);
console.log(videos);
const cliente = {
	nome: "Andre",
	compras: {
		digitais: {
			livros: ["Livro 1", "Livro 2"],
			videos: ["Video JS", "Video HTML"],
		},
		fisicas: {
			cadernos: ["Caderno 1"],
		},
	},
};

const {
	fisicas,
	digitais,
	digitais: { livros, videos },
} = cliente.compras;

console.log(fisicas);
console.log(livros);
console.log(videos);
console.log(digitais);
const cliente = {
	nome: "Andre",
	compras: 10,
};

const { nome, compras } = cliente;
// ou
const { nome: nomeCliente, compras: comprasCliente } = cliente;
const cliente = {
	nome: "Andre",
	compras: 10,
};

const { nome, compras, email = "email@gmail.com", cpf } = cliente;
console.log(email); // email@gmail.com
console.log(cpf); // undefined
const frutas = ["Banana", "Uva", "Morango"];

const primeiraFruta = frutas[0];
const segundaFruta = frutas[1];
const terceiraFruta = frutas[2];

// Com destructuring
const [primeira, segunda, terceira] = frutas;
const primeiro = "Item 1";
const segundo = "Item 2";
const terceiro = "Item 3";
// ou
const [primeiro, segundo, terceiro] = ["Item 1", "Item 2", "Item 3"];
function handleKeyboard(event) {
	console.log(event.key);
}
// Com Destructuring
function handleKeyboard({ key }) {
	console.log(key);
}

document.addEventListener("keyup", handleKeyboard);
// Extraia o backgroundColor, color e margin do btn
const btn = document.querySelector("button");
const btnStyles = getComputedStyle(btn);

// Troque os valores das variáveis abaixo
let cursoAtivo = "JavaScript";
let cursoInativo = "HTML";

// Corrija o erro abaixo
const cachorro = {
	nome: "Bob",
	raca: "Labrador",
	cor: "Amarelo",
};

const { bobCor: cor } = cachorro;
function perimetroForma(lado, totalLados) {
	return lado * totalLados;
}

perimetroForma(10, 4); // 40
perimetroForma(10); // NaN
function perimetroForma(lado, totalLados) {
	totalLados = totalLados || 4; // se não for definido, será igual à 4
	return lado * totalLados;
}

perimetroForma(10, 3); // 30
perimetroForma(10); // 40
function perimetroForma(lado, totalLados = 4) {
	return lado * totalLados;
}

perimetroForma(10, 5); // 50
perimetroForma(10); // 40
function perimetroForma(lado, totalLados = 4) {
	console.log(arguments);
	return lado * totalLados;
}

perimetroForma(10);
perimetroForma(10, 4, 20);
function anunciarGanhadores(...ganhadores) {
	ganhadores.forEach(ganhador => {
		console.log(ganhador + " ganhou.");
	});
}

anunciarGanhadores("Pedro", "Marta", "Maria");
function anunciarGanhadores(premio, ...ganhadores) {
	ganhadores.forEach(ganhador => {
		console.log(ganhador + " ganhou um " + premio);
	});
}

anunciarGanhadores("Carro", "Pedro", "Marta", "Maria");
function anunciarGanhadores(premio, ...ganhadores) {
	console.log(ganhadores);
	console.log(arguments);
}

anunciarGanhadores("Carro", "Pedro", "Marta", "Maria");
const frutas = ["Banana", "Uva", "Morango"];
const legumes = ["Cenoura", "Batata"];

const comidas = [...frutas, "Pizza", ...legumes];
const numeroMaximo = Math.max(4, 5, 20, 10, 30, 2, 33, 5); // 33

const listaNumeros = [1, 13, 21, 12, 55, 2, 3, 43];
const numeroMaximoSpread = Math.max(...listaNumeros);
const btns = document.querySelectorAll("button");
const btnsArray = [...btns];

const frase = "Isso é JavaScript";
const fraseArray = [...frase];
// Reescreva a função utilizando
// valores iniciais de parâmetros com ES6
function createButton(background, color) {
	background = background || "blue";
	if (color === undefined) {
		color = "red";
	}
	const buttonElement = document.createElement("button");
	buttonElement.style.background = background;
	return buttonElement;
}

const redButton = createButton();

// Utilize o método push para inserir as frutas ao final de comidas.
const frutas = ["Banana", "Uva", "Morango"];
const comidas = ["Pizza", "Batata"];
const frutas = ["Banana", "Morango", "Uva"];
const frase = "Isso é JavaScript";

fetch("https://pokeapi.co/api/v2/pokemon/").then(({ headers }) =>
	console.log(headers)
);
const frutas = ["Banana", "Morango", "Uva"];
const frase = "Isso é JavaScript";

for (const fruta of frutas) {
	console.log(fruta);
}

for (const char of frase) {
	console.log(char);
}
const buttons = document.querySelectorAll("button");

for (const btn of buttons) {
	btn.style.background = "blue";
}

console.log(...buttons);
const carro = {
	marca: "Honda",
	ano: 2018,
};

// Erro, não é Iterável
for (const propriedade of carro) {
	console.log(propriedade);
}
const carro = {
	marca: "Honda",
	ano: 2018,
};

for (const propriedade in carro) {
	console.log(propriedade);
}
const frutas = ["Banana", "Morango", "Uva"];

for (const index in frutas) {
	console.log(index);
}

for (const index in frutas) {
	console.log(frutas[index]);
}
const btn = document.querySelector("button");
const btnStyles = getComputedStyle(btn);

for (const style in btnStyles) {
	console.log(`${style}: ${btnStyles[style]}`);
}
let i = 0;
do {
	console.log(i++);
} while (i <= 5);
// Procura: a
const padraoRegexp = /a/;

const texto = "JavaScript";
const novoTexto = texto.replace(padraoRegexp, "B");
// BavaScript
// Procura: J seguido de a, v e a
const regexp = /Java/;

"JavaScript".replace(regexp, "Type");
// TypeScript
// Procura: Todo a
const regexp = /a/g;

"JavaScript".replace(regexp, "i");
// JiviScript
// Procura: Todo PE, Pe, pE e pe
const regexp = /Pe/gi;

"Perdeu perdido".replace(regexp, "Ba");
// Bardeu Bardido
// Procura: Todo a, A, i, I
const regexp = /[ai]/gi;

"JavaScript".replace(regexp, "u");
// JuvuScrupt
// Procura: - ou .
const regexp = /[-.]/g;

"111.222-333-44".replace(regexp, "");
// 11122233344
// Procura: B, seguido de r, a
// seguido de s ou z, seguido de i, l
const regexp = /Bra[sz]il/g;

"Brasil é com z: Brazil".replace(regexp, "Prazer");
// Prazer é com z: Prazer
// Busca por itens de a à z
const regexp = /[a-z]/g;

"JavaScript é a linguagem.".replace(regexp, "0");
// J000S00000 é 0 000000000.

// Busca por itens de a à z e A à Z
const regexp = /[a-zA-Z]/g;

"JavaScript é a linguagem.".replace(regexp, "1");
// 1111111111 é 1 111111111.

// Busca por números de 0 à 9
const regexpNumero = /[0-9]/g;

"123.333.333-33".replace(regexpNumero, "X");
// XXX.XXX.XXX-XX
// Procura: tudo que não estiver entre a e z
const regexp = /[^a-z]/g;

"Brasil é com z: Brazil".replace(regexp, " ");
// rasil   com z   razil
// Procura: todos os caracteres menos quebra de linha
const regexp = /./g;

"JavaScript é a linguagem.".replace(regexp, "0");
// 0000000000000000000000000
// Procura: todos os pontos
const regexp = /\./g;
const regexpAlternativa = /[.]/g;

"999.222.222.11".replace(regexp, "-");
// 999-222-222-11
// Procura: todos os alfanuméricos
const regexp = /\w/g;

"Guarda-chuva R$ 23,00.".replace(regexp, "-");
// ------------ -$ --,--.
// Procura: o que não for caracter alfanuméricos
const regexp = /\W/g;

"Guarda-chuva R$ 23,00.".replace(regexp, "-");
// Guarda-chuva-R--23-00-
// Procura: todos os dígitos
const regexp = /\d/g;

"+55 (21) 2222-2222".replace(regexp, "X");
// +XX (XX) XXXX-XXXX.
// Procura: o que não for dígito
const regexp = /\D/g;

"+55 (21) 2222-2222".replace(regexp, "");
// 552122222222
// Procura: espaços em branco
const regexp = /\s/g;

"+55 (21) 2222-  2222  ".replace(regexp, "");
// +55(21)2222-2222
// Procura: o que não for espaço em branco
const regexp = /\S/g;

"+55 (21) 2222-  2222  ".replace(regexp, "");
// XXX XXXX XXXXX  XXXX

=/[\s\S]/g irá selecionar tudo.

// Procura: 4 a's seguidos
const regexp = /aaaa/g;
const regexpAlt = /a{4}/g;

"Vaaaai ali por favor.".replace(regexp, "a");
// Vai ali por favor.
// Procura: dígitos seguidos de 2 à 3
const regexp = /\d{2,3}/g;

"222.333.222.42".replace(regexp, "X");
// X.X.X.X

// Procura: letras seguidos com 1 caracter ou mais
const regexpLetras = /\w{1,}/g;

"A melhor linguagem é JavaScript".replace(regexpLetras, "X");
// X X X é X
// Procura: dígitos em ocorrência de um ou mais
const regexp = /\d+/g;

"222.333.222.42".replace(regexp, "X");
// X.X.X.X

// Procura: Começa com d, seguido por uma ou mais letras.
const regexpLetras = /d\w+/g;

"Dígitos, dados, desenhos, Dito, d".replace(regexpLetras, "X");
// Dígitos, X, X, Dito, d
// Procura: Começa com d, seguido por zero ou mais letras.
const regexp = /d\w*/g;

"Dígitos, dados, desenhos, Dito, d".replace(regexp, "X");
// Dígitos, X, X, Dito, X
// Procura: Por regex com p opcional
const regexp = /regexp?/g;

"Qual é o certo, regexp ou regex?".replace(regex, "Regular Expression");
// Qual é o certo, Regular Expression ou Regular Expression?
// Procura: java ou php (case insensitive)
const regexp = /java|php/gi;

"PHP e Java são linguagens diferentes".replace(regexp, "X");
// X e X são linguagens diferente
// Procura: java (case insensitive)
const regexp = /java/gi;
"Java não é JavaScript.".replace(regexp, "X");
// X não é XScript.

// Procura: java (case insensitive)
const regexpBoundary = /\bjava\b/gi;
"Java não é JavaScript.".replace(regexpBoundary, "X");
// X não é JavaScript.

// Procura: Dígitos em sequência, que estejam isolados
const regexpDigito = /\b\d+\b/gi;
"O Restaurante25 na Rua 3, custa R$ 32,00".replace(regexDigito, "X");
// O Restaurante25 na Rua X, custa R$ X,X

"11_22 33-44 55é66 77e88".replace(regexpDigito, "X");
// 11_22 X-X XéX 77e88
const regexpDigito = /\B\d+\B/gi;

"11_22 33-44 55é66 77e88".replace(regexpDigito, "X");
// 1X_X2 33-44 55é66 7XeX8
// Procura: sequência de alfanuméricos
// no início da linha.
const regexp = /^\w+/g;

`andre@origamid.com
contato@origamid.com`.replace(regexp, "X");
// X@origamid.com
// contato@origamid.com
// Procura: sequência de alfanuméricos
// no final da linha.
const regexp = /\w+$/g;

`andre@origamid.com
contato@origamid.com`.replace(regexp, "X");
// andre@origamid.com
// contato@origamid.X
// Procura: sequência de alfanuméricos
// no final da linha.
const regexp = /\w+$/gm;

`andre@origamid.com
contato@origamid.com`.replace(regexp, "X");
// andre@origamid.X
// contato@origamid.X

// Procura: sequência de alfanuméricos
// no início da linha.
const regexp = /^\w+/gm;

`andre@origamid.com
contato@origamid.com`.replace(regexp, "X");
// X@origamid.com
// X@origamid.com
const regexp = /\n/g;

`andre@origamid.com\ncontato@origamid.com`.replace(regexp, '---');
// andre@origamid.com---contato@origamid.com

`andre@origamid.com
contato@origamid.com`.replace(regexp, 'X');
// andre@origamid.com---contato@origamid.com
\t seleciona tabs
// Procura: @ ou ©
const regexp = /\u0040|\u00A9/g;

"andre@origamid.com ©".replace(regexp, "---");
// andre---origamid.com ---
// Procura: Java
const regexp = /Java/g;

"PHP e Java são linguagens diferentes".replace(regexp, "--$&Script");
// PHP e --JavaScript são linguagens diferentes
// $& será igual à Java
// Procura: sequência alfanumérica, seguida
// de @, seguido de alfanumérico ou .
const regexp = /(\w+)@[\w.]+/g;

"andre@email.com.br".replace(regexp, "$1@gmail.com");
// andre@gmail.com
// Procura: sequência alfanumérica, seguida
// de , seguido espaço de sequência alfanumérica.
const regexp = /(\w+),\s(\w+)/g;

"Rafael, Andre".replace(regexp, "$2 $1");
// Andre Rafael
// Procura: qualquer sequência de ta
const regexp = /(ta)+/gi;

"Tatata, tata, ta".replace(regexp, "Pá");
// Pá, Pá, Pá
// Procura: qualquer sequência de ta
const regexp = /(?:ta)+/gi;

"Tatata, tata, ta".replace(regexp, "Pá");
// Pá, Pá, Pá
// Procura: dígitos em sequência, que
// possuírem px, sem selecionar o px.
const regexp = /\d(?=px)/g;

"2em, 4px, 5%, 2px, 1px".replace(regexp, "X");
// 2em, Xpx, 5%, Xpx, Xpx
// Procura: dígitos que não possuírem px
// sem selecionar o restante.
const regexp = /\d(?!px)/g;

"2em, 4px, 5%, 5px, 1px".replace(regexp, "X");
// Xem, 4px, X%, 5px, 1px
// Procura: dígitos que possuírem R$
// na frente dos mesmos
const regexp = /(?<=R\$)[\d]+/g;

"R$99, 100, 200, R$20".replace(regexp, "X");
// R$X, 100, 200, R$X
const regexpCEP = /\d{5}[-\s]?\d{3}/g;

const ceps = ["00000-000", "00000 000", "00000000"];

for (cep of ceps) {
	console.log(cep, cep.match(regexpCEP));
}
const regexpCPF = /(?:\d{3}[-.]?){3}\d{2}/g;

const cpfs = [
	"000.000.000-00",
	"000-000-000-00",
	"000.000.000.00",
	"000000000-00",
	"00000000000",
];

for (cpf of cpfs) {
	console.log(cpf, cpf.match(regexpCPF));
}
const regexpCNPJ = /\d{2}[-.]?(?:\d{3}[-.]?){2}[-\/]?\d{4}[-.]?\d{2}/g;

const cnpjs = [
	"00.000.000/0000-00",
	"00000000000000",
	"00-000-000-0000-00",
	"00.000.000/000000",
	"00.000.000.000000",
	"00.000.000.0000.00",
];

for (cnpj of cnpjs) {
	console.log(cnpj, cnpj.match(regexpCNPJ));
}
const regexpTELEFONE = /(?:\+?55\s?)?(?:\(?\d{2}\)?[-\s]?)?\d{4,5}[-\s]?\d{4}/g;

const telefones = [
	"+55 11 98888-8888",
	"+55 11 98888 8888",
	"+55 11 988888888",
	"+55 11988888888",
	"+5511988888888",
	"5511988888888",
	"11 98888-8888",
	"11 98888 8888",
	"(11) 98888 8888",
	"(11) 98888-8888",
	"11-98888-8888",
	"11 98888 8888",
	"11988888888",
	"11988888888",
	"988888888",
	"(11)988888888",
	"98888 8888",
	"8888 8888",
];

for (telefone of telefones) {
	console.log(telefone, telefone.match(regexpTELEFONE));
}
const regexpEMAIL = /[\w.-]+@[\w-]+\.[\w-.]+/gi;

const emails = [
	"email@email.com",
	"email@email.com.org",
	"email-email@email.com",
	"email_email@email.com",
	"email.email23@email.com.br",
	"email.email23@empresa-sua.com.br",
	"c@contato.cc",
];

for (email of emails) {
	console.log(email, email.match(regexpEMAIL));
}
const regexpTAG = /<\/?[\w\s="']+\/?>/gi;
const tags = [
	"<div>Isso é uma div</div>",
	'<div class="ativa">Essa está ativa</div>',
	'<img src="imagem" />',
	'<img src="imagem">',
	'<ul class="ativa">',
	"<li>Essa está ativa</li>",
	"</ul>",
];

for (tag of tags) {
	console.log(tag, tag.match(regexpTAG));
}
const regexpTAG = /(?<=<\/?)[\w]+/gi;
const tags = [
	"<div>Isso é uma div</div>",
	'<div class="ativa">Essa está ativa</div>',
	'<img src="imagem" />',
	'<img src="imagem">',
	'<ul class="ativa">',
	"<li>Essa está ativa</li>",
	"</ul>",
];

for (tag of tags) {
	console.log(tag, tag.match(regexpTAG));
}
const regexp = /\w+/gi;

// Se passarmos uma string, não precisamos dos //
// e devemos utilizar \\ para meta characters, pois é necessário
// escapar a \ especial. As Flags são o segundo argumento
const regexpObj1 = new RegExp("\\w+", "gi");
const regexpObj2 = new RegExp(/\w+/, "gi");

"JavaScript Linguagem 101".replace(regexpObj1, "X");
// X X X

// Exemplo complexo:
const regexpTELEFONE1 =
	/(?:\+?55\s?)?(?:\(?\d{2}\)?[-\s]?)?\d{4,5}[-\s]?\d{4}/g;
const regexpTELEFONE2 = new RegExp(
	"(?:\\+?55\\s?)?(?:\\(?\\d{2}\\)?[-\\s]?)?\\d{4,5}[-\\s]?\\d{4}",
	"g"
);
const regexp = /\w+/gi;

regexp.flags; // 'gi'
regexp.global; // true
regexp.ignoreCase; // true
regexp.multiline; // false
regexp.source; // '\w+'
const regexp = /Java/g;
const frase = "JavaScript e Java";

regexp.lastIndex; // 0
regexp.test(frase); // true
regexp.lastIndex; // 4
regexp.test(frase); // true
regexp.lastIndex; // 17
regexp.test(frase); // false
regexp.lastIndex; // 0
regexp.test(frase); // true (Reinicia
regexp.lastIndex; // 4
const regexp = /Script/g;
const frase = "JavaScript, TypeScript e CoffeeScript";

let i = 1;
while (regexp.test(frase)) {
	console.log(i++, regexp.lastIndex);
}
// 1 10
// 2 22
// 3 37
const regexp = /\w{2,}/g;
const frase = "JavaScript, TypeScript e CoffeeScript";

regexp.exec(frase);
// ["JavaScript", index: 0, input: "JavaScript,
// TypeScript e CoffeeScript", groups: undefined]
regexp.exec(frase);
// ["TypeScript", index: 12, input: "JavaScript,
// TypeScript e CoffeeScript", groups: undefined]
regexp.exec(frase);
// ["CoffeeScript", index: 25, input: "JavaScript,
// TypeScript e CoffeeScript", groups: undefined]
regexp.exec(frase);
// null
regexp.exec(frase); // Reinicia
// ["JavaScript", index: 0, input: "JavaScript,
// TypeScript e CoffeeScript", groups: undefined]
const regexp = /\w{2,}/g;
const frase = "JavaScript, TypeScript e CoffeeScript";
let regexpResult;

while ((regexpResult = regexp.exec(frase)) !== null) {
	console.log(regexpResult[0]);
}
const regexp = /\w{2,}/g;
const regexpSemG = /\w{2,}/;
const frase = "JavaScript, TypeScript e CoffeeScript";

frase.match(regexp);
// ['JavaScript', 'TypeScript', 'CoffeeScript']

frase.match(regexpSemG);
// ["JavaScript", index: 0, input: "JavaScript,
// TypeScript e CoffeeScript", groups: undefined]
const frase = "JavaScript, TypeScript, CoffeeScript";

frase.split(", ");
// ["JavaScript", "TypeScript", "CoffeeScript"]
frase.split(/Script/g);
// ["Java", ", Type", ", Coffee", ""]

const tags = `
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
</ul>
`;

tags.split(/(?<=<\/?)\w+/g).join("div");
// <div>
//   <div>Item 1</div>
//   <div>Item 2</div>
// <div>
const tags = `
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
</ul>
`;

tags.replace(/(?<=<\/?)\w+/g, "div");
// <div>
//   <div>Item 1</div>
//   <div>Item 2</div>
// <div>
const tags = `
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
</ul>
`;

tags.replace(/<li/g, '$& class="ativo"');
// <ul>
//   <li class="ativo">Item 1</li>
//   <li class="ativo">Item 2</li>
// </ul>
const emails = `
empresa@email.com
contato@email.com
suporte@email.com
`;

emails.replace(/(\w+@)[\w.]+/g, "$1gmail.com");
// empresa@gmail.com
// contato@gmail.com
// suporte@gmail.com
const regexp = /(\w+)(@[\w]+)/g;
const emails = `joao@homail.com.br
marta@ggmail.com.br
bruna@oulook.com.br`;

emails.replace(regexp, function (...args) {
	console.log(args);
	if (args[2] === "@homail") {
		return `${args[1]}@hotmail`;
	} else if (args[2] === "@ggmail") {
		return `${args[1]}@gmail`;
	} else if (args[2] === "@oulook") {
		return `${args[1]}@outlook`;
	} else {
		return "x";
	}
});

// joao@hotmail.com.br
// marta@gmail.com.br
// bruna@outlook.com.br