ECMAScript
O ECMAScript (ES) é a especificação que define as linguagens de script, como o JavaScript. Ele tem evoluído desde sua criação em 1997 para incluir novos recursos e funcionalidades que atendem às demandas dos desenvolvedores modernos. Abaixo, apresento a evolução do ECMAScript, destacando suas principais versões e inovações.
ECMAScript 1 (1997)
- Primeira versão da linguagem.
-
Definiu a base do JavaScript, como tipos de dados, estruturas de
controle, objetos padrão (como
Object
,Array
, eDate
) e funções.
ECMAScript 2 (1998)
- Pequenas alterações para alinhar o ECMAScript ao padrão internacional ISO/IEC 16262.
- Sem grandes mudanças para desenvolvedores.
ECMAScript 3 (1999)
- Tornou o JavaScript mais robusto e amplamente utilizado.
-
Novidades:
- Suporte a expressões regulares (veremos em aulas posteriores)
-
Controle de exceções com
try/catch (veremos em aulas posteriores)
. - Melhor manipulação de strings.
- Adição do modo estrito (strict mode). (veremos em aulas posteriores)
ECMAScript 4 (Cancelado)
A proposta para esta versão era ambiciosa, incluindo tipagem estática e classes complexas, mas acabou sendo abandonada devido à falta de consenso.
ECMAScript 5 (2009)
- Foco na melhoria de performance e na padronização do JavaScript.
-
Novidades:
-
Suporte ao modo estrito (
"use strict"
). (veremos em aulas posteriores) -
Métodos úteis como
Array.prototype.map
,filter
,forEach
, ereduce
. -
Propriedades imutáveis com
Object.defineProperty
. - JSON nativo para manipulação de dados.
-
Suporte ao modo estrito (
ECMAScript 6 (2015)
Um marco na evolução do JavaScript, introduzindo recursos modernos.
-
Novidades:
- Sintaxe de classes (
class
). -
Declaração de variáveis com
let
econst
. - Arrow functions (
=>
). - Template literals (strings interpoladas com crases).
- Destructuring (
const {x, y} = obj
). - Módulos (
import/export
). - Promises para programação assíncrona.
- Operador spread/rest (
...
).
- Sintaxe de classes (
Veremos a seguir a explicação detalhada dessas mudanças tão significativas no JavaScript
ECMAScript 7 (2016)
**
)Uma forma simplificada de calcular potências.
console.log(2 ** 3); // 8
Array.prototype.includes
Verifica se um valor está presente em um array.
const numeros = [1, 2, 3];
console.log(numeros.includes(2)); // true
console.log(numeros.includes(4)); // false
ECMAScript 8 (2017)
Object.values
e Object.entries
Object.values: Retorna os valores de um objeto. Object.entries: Retorna pares chave-valor como arrays.
const pessoa = { nome: "Maria", idade: 25 };
console.log(Object.values(pessoa)); // ["Maria", 25]
console.log(Object.entries(pessoa)); // [["nome", "Maria"], ["idade", 25]]
String.prototype.padStart
e padEnd
Adiciona preenchimento no início ou no final de uma string.
console.log("5".padStart(3, "0")); // "005"
console.log("5".padEnd(3, "-")); // "5--"
async/await (veremos em aulas posteriores)
ECMAScript 9 (2018)
- Rest/Spread em Objetos (veremos em aulas posteriores)
- Promise.prototype.finally (veremos em aulas posteriores)
-
Iteração Assíncrona (
for await...of
) (veremos em aulas posteriores)
Arrow Function
Funções em JavaScript podem ser declaradas de diferentes formas, sendo as mais comuns a função normal e a arrow function. Ambas possuem diferenças importantes em sintaxe e comportamento.
Funções de seta introduzem uma sintaxe curta para escrever funções.
Além disso, elas não têm seu próprio this
, herdando do
contexto ao redor.
Sintaxe
A principal diferença inicial é a forma como as funções são escritas:
-
Função Normal: É escrita com a palavra-chave
function
:
function soma(a, b) {
return a + b;
}
console.log(soma(2, 3)); // Saída: 5
-
Arrow Function: Usa uma sintaxe mais curta, com
=>
:
const soma = (a, b) => a + b;
console.log(soma(2, 3)); // Saída: 5
Comportamento do this
O comportamento do this
é uma das principais diferenças:
-
Função Normal: O
this
é dinâmico, dependendo do contexto em que a função foi chamada.
const obj = {
valor: 10,
funcaoNormal: function () {
return this.valor;
},
};
console.log(obj.funcaoNormal()); // Saída: 10
-
Arrow Function: O
this
é léxico, herdando o contexto onde a função foi definida.
const obj = {
valor: 10,
arrowFunction: () => {
return this.valor;
},
};
console.log(obj.arrowFunction()); // Saída: undefined
Uso como Construtor
Apenas funções normais podem ser usadas como construtores:
// Função Normal
function Pessoa(nome) {
this.nome = nome;
}
const pessoa1 = new Pessoa("João");
console.log(pessoa1.nome); // Saída: João
// Arrow Function
const Pessoa = (nome) => {
this.nome = nome;
};
const pessoa1 = new Pessoa("João"); // Erro: Pessoa não é um construtor
Explicação sobre o this
A palavra-chave this
representa o objeto ao qual a função
atual pertence. Seu valor depende de onde e como a função foi chamada:
-
Em um método de objeto,
this
refere-se ao objeto pai. -
Em uma função regular,
this
éundefined
no modo estrito ou o objeto global fora dele. -
Em funções de seta,
this
é herdado do contexto lexical.