Médio JavaScript

BigInt e Symbol na prática

Enunciado

Crie um programa que:

  1. Declare um BigInt muito grande (maior que Number.MAX_SAFE_INTEGER) e imprima seu valor e tipo.
  2. Crie dois Symbol com a mesma descrição e mostre que eles são diferentes.
  3. Use um Symbol como chave de um objeto e acesse o valor correspondente.

Requisitos

  • Declare um BigInt usando a notação n ou BigInt().
  • Imprima o valor do BigInt e seu tipo com typeof.
  • Crie dois Symbol com a mesma descrição e compare com ===, imprimindo false.
  • Crie um objeto com uma chave do tipo Symbol e acesse o valor usando essa chave.

Código inicial

// Implemente os passos solicitados

Saída esperada

BigInt: 9007199254740993n, tipo: bigint
Symbols iguais? false
Valor da chave symbol: 42
Ver dica

Para criar um BigInt, use 9007199254740993n ou BigInt("9007199254740993"). Para usar Symbol como chave, defina const chave = Symbol("chave") e depois obj[chave] = valor.

Mostrar solução
// 1. BigInt
const grande = 9007199254740993n; // maior que Number.MAX_SAFE_INTEGER
console.log(`BigInt: ${grande}, tipo: ${typeof grande}`);

// 2. Symbols únicos
const sym1 = Symbol("id");
const sym2 = Symbol("id");
console.log(`Symbols iguais? ${sym1 === sym2}`); // false

// 3. Symbol como chave de objeto
const chave = Symbol("chave");
const obj = {
  [chave]: 42
};
console.log(`Valor da chave symbol: ${obj[chave]}`);

Passo a passo

  1. Criamos grande com o literal 9007199254740993n, que excede Number.MAX_SAFE_INTEGER (2^53 - 1).
  2. Usamos typeof grande para mostrar que é "bigint".
  3. Criamos sym1 e sym2 com a mesma descrição "id", mas cada chamada a Symbol() gera um valor único.
  4. Comparamos sym1 === sym2 e imprimimos false.
  5. Criamos chave como um Symbol e usamos a sintaxe de chave computada [chave] para definir a propriedade no objeto obj.
  6. Acessamos obj[chave] e imprimimos o valor 42.

Por que funciona

BigInt é um tipo primitivo que representa inteiros de precisão arbitrária. A notação n no final do número cria um BigInt literal. Symbol é um tipo primitivo que garante unicidade: mesmo com a mesma descrição, dois Symbols nunca são iguais. Usar Symbol como chave de objeto evita colisões com outras propriedades.

Erros comuns

  • Tentar misturar BigInt com Number em operações aritméticas: 1n + 1 gera TypeError. Converta explicitamente: 1n + BigInt(1).
  • Usar new Symbol(): Symbol não é um construtor, então new Symbol() lança TypeError. Use Symbol("desc").
  • Esquecer os colchetes ao usar Symbol como chave: obj.chave procura a propriedade string "chave", não o Symbol. Use obj[chave].

Outra forma de resolver

Para criar BigInt a partir de string: BigInt("9007199254740993"). Para Symbols como chaves, pode-se usar Object.defineProperty(obj, chave, { value: 42 }). Preferível quando se precisa controlar descritores da propriedade.

Saída esperada

BigInt: 9007199254740993n, tipo: bigint
Symbols iguais? false
Valor da chave symbol: 42