Skip to content
Back to skills

Javascript Mastery

ASecurity

Referência abrangente de JavaScript cobrindo 33+ conceitos essenciais que todo desenvolvedor deve conhecer. Desde fundamentos como primitivos e closures até padrões avançados como async/await e programação funcional. Use ao explicar conceitos de JS, depurar problemas de JavaScript ou ensinar fundamentos de JavaScript.

  • 11 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 8, 2026
developmentjavascriptgojavanodeexpressgitapi

Works with

  • api

Security analysis

A100/100

Scanned September 8, 2026

npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill javascript-mastery --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Javascript Mastery?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Javascript Mastery
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/artubss-javascript-mastery/badge)](https://www.skillsdirectory.com/skills/artubss-javascript-mastery)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: javascript-mastery
description: "Referência abrangente de JavaScript cobrindo 33+ conceitos essenciais que todo desenvolvedor deve conhecer. Desde fundamentos como primitivos e closures até padrões avançados como async/await e programação funcional. Use ao explicar conceitos de JS, depurar problemas de JavaScript ou ensinar fundamentos de JavaScript."
---

# 🧠 JavaScript Mastery

> 33+ conceitos essenciais de JavaScript que todo desenvolvedor deve conhecer, inspirado em [33-js-concepts](https://github.com/leonardomso/33-js-concepts).

## Quando Usar Esta Skill

Use esta skill quando:

- Explicar conceitos de JavaScript
- Depurar comportamentos complicados de JS
- Ensinar fundamentos de JavaScript
- Revisar código para boas práticas em JS
- Entender peculiaridades da linguagem

---

## 1. Fundamentos

### 1.1 Tipos Primitivos

JavaScript possui 7 tipos primitivos:

```javascript
// String
const str = "hello";

// Number (inteiros e floats)
const num = 42;
const float = 3.14;

// BigInt (para inteiros grandes)
const big = 9007199254740991n;

// Boolean
const bool = true;

// Undefined
let undef; // undefined

// Null
const empty = null;

// Symbol (identificadores únicos)
const sym = Symbol("description");
```

**Pontos-chave**:

- Primitivos são imutáveis
- Passados por valor
- `typeof null === "object"` é um bug histórico

### 1.2 Coerção de Tipo

JavaScript converte tipos implicitamente:

```javascript
// Coerção de string
"5" + 3; // "53" (number → string)
"5" - 3; // 2    (string → number)

// Coerção de boolean
Boolean(""); // false
Boolean("hello"); // true
Boolean(0); // false
Boolean([]); // true (!)

// Coerção de igualdade
"5" == 5; // true  (coage)
"5" === 5; // false (estrito)
```

**Valores falsy** (8 no total):
`false`, `0`, `-0`, `0n`, `""`, `null`, `undefined`, `NaN`

### 1.3 Operadores de Igualdade

```javascript
// == (igualdade solta) - coage tipos
null == undefined; // true
"1" == 1; // true

// === (igualdade estrita) - sem coerção
null === undefined; // false
"1" === 1; // false

// Object.is() - trata casos especiais
Object.is(NaN, NaN); // true (NaN === NaN é false!)
Object.is(-0, 0); // false (0 === -0 é true!)
```

**Regra**: Sempre use `===` a menos que tenha uma razão específica para não fazer.

---

## 2. Escopo & Closures

### 2.1 Tipos de Escopo

```javascript
// Escopo global
var globalVar = "global";

function outer() {
  // Escopo de função
  var functionVar = "function";

  if (true) {
    // Escopo de bloco (somente let/const)
    let blockVar = "block";
    const alsoBlock = "block";
    var notBlock = "function"; // var ignora blocos!
  }
}
```

### 2.2 Closures

Um closure é uma função que lembra de seu escopo léxico:

```javascript
function createCounter() {
  let count = 0; // variável "fechada"

  return {
    increment() {
      return ++count;
    },
    decrement() {
      return --count;
    },
    getCount() {
      return count;
    },
  };
}

const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
counter.getCount(); // 2
```

**Casos de uso comuns**:

- Privacidade de dados (padrão de módulo)
- Fábricas de função
- Aplicação parcial
- Memoização

### 2.3 var vs let vs const

```javascript
// var - escopo de função, hoisted, pode redeclarar
var x = 1;
var x = 2; // OK

// let - escopo de bloco, hoisted (TDZ), sem redeclaração
let y = 1;
// let y = 2; // Erro!

// const - como let, mas não pode reatribuir
const z = 1;
// z = 2; // Erro!

// MAS: objetos const são mutáveis
const obj = { a: 1 };
obj.a = 2; // OK
obj.b = 3; // OK
```

---

## 3. Funções & Execução

### 3.1 Call Stack

```javascript
function first() {
  console.log("first start");
  second();
  console.log("first end");
}

function second() {
  console.log("second");
}

first();
// Output:
// "first start"
// "second"
// "first end"
```

Exemplo de stack overflow:

```javascript
function infinite() {
  infinite(); // Sem caso base!
}
infinite(); // RangeError: Maximum call stack size exceeded
```

### 3.2 Hoisting

```javascript
// Hoisting de variável
console.log(a); // undefined (hoisted, não inicializado)
var a = 5;

console.log(b); // ReferenceError (TDZ)
let b = 5;

// Hoisting de função
sayHi(); // Funciona!
function sayHi() {
  console.log("Hi!");
}

// Expressões de função não sofrem hoisting
sayBye(); // TypeError
var sayBye = function () {
  console.log("Bye!");
};
```

### 3.3 Palavra-chave this

```javascript
// Contexto global
console.log(this); // window (browser) ou global (Node)

// Método de objeto
const obj = {
  name: "Alice",
  greet() {
    console.log(this.name); // "Alice"
  },
};

// Arrow functions (this léxico)
const obj2 = {
  name: "Bob",
  greet: () => {
    console.log(this.name); // undefined (herda this externo)
  },
};

// Binding explícito
function greet() {
  console.log(this.name);
}
greet.call({ name: "Charlie" }); // "Charlie"
greet.apply({ name: "Diana" }); // "Diana"
const bound = greet.bind({ name: "Eve" });
bound(); // "Eve"
```

---

## 4. Event Loop & Async

### 4.1 Event Loop

```javascript
console.log("1");

setTimeout(() => console.log("2"), 0);

Promise.resolve().then(() => console.log("3"));

console.log("4");

// Output: 1, 4, 3, 2
// Por quê? Microtasks (Promises) executam antes de macrotasks (setTimeout)
```

**Ordem de execução**:

1. Código síncrono (call stack)
2. Microtasks (callbacks de Promise, queueMicrotask)
3. Macrotasks (setTimeout, setInterval, I/O)

### 4.2 Callbacks

```javascript
// Padrão de callback
function fetchData(callback) {
  setTimeout(() => {
    callback(null, { data: "result" });
  }, 1000);
}

// Convenção error-first
fetchData((error, result) => {
  if (error) {
    console.error(error);
    return;
  }
  console.log(result);
});

// Callback hell (evitar!)
getData((data) => {
  processData(data, (processed) => {
    saveData(processed, (saved) => {
      notify(saved, () => {
        // 😱 Pirâmide do caos
      });
    });
  });
});
```

### 4.3 Promises

```javascript
// Criando uma Promise
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("Success!");
    // ou: reject(new Error("Failed!"));
  }, 1000);
});

// Consumindo Promises
promise
  .then((result) => console.log(result))
  .catch((error) => console.error(error))
  .finally(() => console.log("Done"));

// Combinadores de Promise
Promise.all([p1, p2, p3]); // Todas devem suceder
Promise.allSettled([p1, p2]); // Espera todas, obtém status
Promise.race([p1, p2]); // Primeira a se resolver
Promise.any([p1, p2]); // Primeira a suceder
```

### 4.4 async/await

```javascript
async function fetchUserData(userId) {
  try {
    const response = await fetch(`/api/users/${userId}`);
    if (!response.ok) throw new Error("Failed to fetch");
    const user = await response.json();
    return user;
  } catch (error) {
    console.error("Error:", error);
    throw error; // Relança para o chamador tratar
  }
}

// Execução paralela
async function fetchAll() {
  const [users, posts] = await Promise.all([
    fetch("/api/users"),
    fetch("/api/posts"),
  ]);
  return { users, posts };
}
```

---

## 5. Programação Funcional

### 5.1 Higher-Order Functions

Funções que recebem ou retornam funções:

```javascript
// Recebe uma função
const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6]

// Retorna uma função
function multiply(a) {
  return function (b) {
    return a * b;
  };
}
const double = multiply(2);
double(5); // 10
```

### 5.2 Funções Puras

```javascript
// Pura: mesma entrada → mesma saída, sem efeitos colaterais
function add(a, b) {
  return a + b;
}

// Impura: modifica estado externo
let total = 0;
function addToTotal(value) {
  total += value; // Efeito colateral!
  return total;
}

// Impura: depende de estado externo
function getDiscount(price) {
  return price * globalDiscountRate; // Dependência externa
}
```

### 5.3 map, filter, reduce

```javascript
const users = [
  { name: "Alice", age: 25 },
  { name: "Bob", age: 30 },
  { name: "Charlie", age: 35 },
];

// map: transforma cada elemento
const names = users.map((u) => u.name);
// ["Alice", "Bob", "Charlie"]

// filter: mantém elementos que correspondem à condição
const adults = users.filter((u) => u.age >= 30);
// [{ name: "Bob", ... }, { name: "Charlie", ... }]

// reduce: acumula em um único valor
const totalAge = users.reduce((sum, u) => sum + u.age, 0);
// 90

// Encadeamento
const result = users
  .filter((u) => u.age >= 30)
  .map((u) => u.name)
  .join(", ");
// "Bob, Charlie"
```

### 5.4 Currying & Composição

```javascript
// Currying: transforma f(a, b, c) em f(a)(b)(c)
const curry = (fn) => {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    }
    return (...moreArgs) => curried(...args, ...moreArgs);
  };
};

const add = curry((a, b, c) => a + b + c);
add(1)(2)(3); // 6
add(1, 2)(3); // 6
add(1)(2, 3); // 6

// Composição: combina funções
const compose =
  (...fns) =>
  (x) =>
    fns.reduceRight((acc, fn) => fn(acc), x);

const pipe =
  (...fns) =>
  (x) =>
    fns.reduce((acc, fn) => fn(acc), x);

const addOne = (x) => x + 1;
const double = (x) => x * 2;

const addThenDouble = compose(double, addOne);
addThenDouble(5); // 12 = (5 + 1) * 2

const doubleThenAdd = pipe(double, addOne);
doubleThenAdd(5); // 11 = (5 * 2) + 1
```

---

## 6. Objetos & Protótipos

### 6.1 Herança Prototípica

```javascript
// Cadeia de protótipos
const animal = {
  speak() {
    console.log("Some sound");
  },
};

const dog = Object.create(animal);
dog.bark = function () {
  console.log("Woof!");
};

dog.speak(); // "Some sound" (herdado)
dog.bark(); // "Woof!" (método próprio)

// Classes ES6 (açúcar sintático)
class Animal {
  speak() {
    console.log("Some sound");
  }
}

class Dog extends Animal {
  bark() {
    console.log("Woof!");
  }
}
```

### 6.2 Métodos de Objeto

```javascript
const obj = { a: 1, b: 2 };

// Chaves, valores, entradas
Object.keys(obj); // ["a", "b"]
Object.values(obj); // [1, 2]
Object.entries(obj); // [["a", 1], ["b", 2]]

// Cópia rasa
const copy = { ...obj };
const copy2 = Object.assign({}, obj);

// Congelar (imutável)
const frozen = Object.freeze({ x: 1 });
frozen.x = 2; // Silenciosamente falha (ou lança em strict mode)

// Selar (sem add/delete, pode modificar)
const sealed = Object.seal({ x: 1 });
sealed.x = 2; // OK
sealed.y = 3; // Falha
delete sealed.x; // Falha
```

---

## 7. JavaScript Moderno (ES6+)

### 7.1 Desestruturação

```javascript
// Desestruturação de array
const [first, second, ...rest] = [1, 2, 3, 4, 5];
// first = 1, second = 2, rest = [3, 4, 5]

// Desestruturação de objeto
const { name, age, city = "Unknown" } = { name: "Alice", age: 25 };
// name = "Alice", age = 25, city = "Unknown"

// Renomeação
const { name: userName } = { name: "Bob" };
// userName = "Bob"

// Aninhado
const {
  address: { street },
} = { address: { street: "123 Main" } };
```

### 7.2 Spread & Rest

```javascript
// Spread: expande iterável
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]

const obj1 = { a: 1 };
const obj2 = { ...obj1, b: 2 }; // { a: 1, b: 2 }

// Rest: coleta remanescente
function sum(...numbers) {
  return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // 10
```

### 7.3 Módulos

```javascript
// Exportações nomeadas
export const PI = 3.14159;
export function square(x) {
  return x * x;
}

// Exportação padrão
export default class Calculator {}

// Importando
import Calculator, { PI, square } from "./math.js";
import * as math from "./math.js";

// Importação dinâmica
const module = await import("./dynamic.js");
```

### 7.4 Optional Chaining & Nullish Coalescing

```javascript
// Optional chaining (?.)
const user = { address: { city: "NYC" } };
const city = user?.address?.city; // "NYC"
const zip = user?.address?.zip; // undefined (sem erro)
const fn = user?.getName?.(); // undefined se sem método

// Nullish coalescing (??)
const value = null ?? "default"; // "default"
const zero = 0 ?? "default"; // 0 (não é nullish!)
const empty = "" ?? "default"; // "" (não é nullish!)

// Compare com ||
const value2 = 0 || "default"; // "default" (0 é falsy)
```

---

## Cartão de Referência Rápida

| Conceito       | Ponto-chave                           |
| :------------- | :------------------------------------ |
| `==` vs `===`  | Sempre use `===`                      |
| `var` vs `let` | Prefira `let`/`const`                 |
| Closures       | Função + escopo léxico                |
| `this`         | Depende de como a função é chamada    |
| Event loop     | Microtasks antes de macrotasks        |
| Funções puras  | Mesma entrada → mesma saída           |
| Protótipos     | `__proto__` → cadeia de protótipos    |
| `??` vs `\|\|` | `??` verifica apenas null/undefined   |

---

## Recursos

- [33 JS Concepts](https://github.com/leonardomso/33-js-concepts)
- [JavaScript.info](https://javascript.info/)
- [MDN JavaScript Guide](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide)
- [You Don't Know JS](https://github.com/getify/You-Dont-Know-JS)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…