Tipos de Dados em JavaScript
Em JavaScript, todos os dados manipulados pertencem a um tipo específico. No total, a linguagem possui oito tipos de dados, divididos entre tipos primitivos e tipos complexos.
Os tipos primitivos são os mais básicos e imutáveis:
- String: representa uma sequência de caracteres, usada para armazenar textos.
- Number: representa um valor numérico, podendo ser inteiros ou de ponto flutuante.
- BigInt: permite trabalhar com números inteiros extremamente grandes, além do limite do tipo Number.
- Boolean: representa valores lógicos, podendo ser
true(verdadeiro) oufalse(falso). - Undefined: indica que uma variável foi declarada, mas ainda não recebeu um valor.
- Null: representa a ausência intencional de valor.
- Symbol: cria identificadores únicos, frequentemente usados como chaves de propriedades em objetos.
Além desses, há um tipo complexo:
- Object: representa uma estrutura de dados mais sofisticada, permitindo armazenar coleções de valores e métodos.
Cada um desses tipos tem seu próprio comportamento e uso específico dentro do JavaScript.
Dados Numéricos
Number
O tipo Number representa valores numéricos em JavaScript, abrangendo tanto números inteiros quanto números fracionários (de ponto flutuante).
Números inteiros:
Podem ser positivos ou negativos, por exemplo, 35 ou -42. Existe um intervalo seguro para representar números inteiros com precisão garantida, indo de -(2⁵³ - 1) até (2⁵³ - 1).
Números Fracionários (Ponto Flutuante)
Números fracionários, também chamados de números de ponto flutuante, utilizam um ponto . para separar a parte inteira da parte fracionária. Exemplos incluem 3.5575 ou -0.25. Esses valores podem ser positivos ou negativos e possuem um intervalo bem mais amplo do que o dos números inteiros seguros, indo até aproximadamente ±1.7976931348623157e+308.
Sistemas Binário, Octal e Hexadecimal
O JavaScript permite definir números em diferentes bases numéricas:
Binário (prefixo
0b)const num1 = 0b1011; // número 11 em decimal console.log(num1); // 11Octal (prefixo
0o)const num1 = 0o11; // número 9 em decimal console.log(num1); // 9Hexadecimal (prefixo
0x)const num1 = 0xff; // número 255 em decimal console.log(num1); // 255 const num2 = 0x1a; // número 26 em decimal console.log(num2); // 26
Essas representações são úteis para manipulações bit a bit e certas aplicações computacionais.
Desde o ECMAScript 2021, para melhorar a legibilidade, é possível usar um sublinhado _ como separador de dígitos:
const num1 = 1234567;
const num2 = 123_4567; // número igual a num1
const num3 = 1234567890;
const num4 = 12_3456_7890; // número igual a num3BigInt
O tipo BigInt foi introduzido no ECMAScript 2020 para representar números inteiros muito grandes, que ultrapassam os limites do tipo Number.
Por que BigInt é necessário?
Embora seja possível lidar com números grandes usando Number, há limitações de precisão ao ultrapassar o intervalo seguro.
Exemplo de erro ao usar Number:
let num = 9007199254740991;
console.log(num); // 9007199254740991
console.log(num + 1); // 9007199254740992
console.log(num + 2); // 9007199254740992 (erro de precisão!)Neste caso, ao somar 2, o JavaScript retorna o mesmo número, pois a precisão do Number não é suficiente para representá-lo corretamente.
Para lidar com esse problema, usamos BigInt, adicionando o sufixo n ao número:
Se quisermos usar BigInt corretamente, devemos declarar o número com o sufixo n desde o início:
let num = 9007199254740991n;
console.log(num); // 9007199254740991
console.log(num + 1n); // 9007199254740992
console.log(num + 2n); // 9007199254740993Agora, o console exibe o valor correto, sem perda de precisão.
Limitações do tipo Number
O tipo Number possui um intervalo de valores seguros que podem ser representados com precisão. Podemos verificar esses limites usando as constantes:
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991Se tentarmos armazenar valores acima desse intervalo usando Number, ocorrerá perda de precisão.
Por exemplo:
const num = 9223372036854775801;
console.log(num); // 9223372036854776000 (erro!)Boolean
O tipo Boolean representa valores booleanos ou lógicos true (verdadeiro) e false (falso):
const isAlive = true;
const isDead = false;String
O tipo String representa cadeias de caracteres, utilizadas para armazenar textos.
Para definir strings em JavaScript, podem ser usadas aspas duplas ", aspas simples ' ou crases `:
const user = "Tom";
const company = "Microsoft";
const language = `JavaScript`;
console.log(user);
console.log(company);
console.log(language);A única regra é que o tipo de aspas usado para abrir a string deve ser o mesmo para fechá-la.
Caso seja necessário incluir aspas dentro da string, podemos:
Se aspas forem encontradas dentro da string, elas devem ser escapadas com uma barra invertida. Por exemplo, se tivermos o texto "Empresa "Burger & Co"", agora vamos escapar as aspas:
const company = 'Empresa \"Burger & Co\"';Também podemos usar um tipo diferente de aspas dentro da string:
const company1 = "Empresa 'Burger & Co'";
const company2 = 'Empresa "Burger & Co"';Além disso, a string pode conter símbolos especiais - sequências de escape, que são interpretadas de uma maneira específica. As sequências mais comuns são "\n" (nova linha) e "\t" (tabulação). Por exemplo:
const text = "Hello Programício\nHello\tWorld";
console.log(text);Ao imprimir no console, o texto da constante text será interpretado da seguinte forma:
Hello Programício Hello World
Interpolação de Strings
Usando crases `, podemos inserir variáveis e expressões dentro de uma string por meio da interpolação, utilizando ${}:
const user = "Tom";
const text = `Nome: ${user}`;
console.log(text); // Nome: TomA interpolação também permite incorporar múltiplas variáveis:
const user = "Tom";
const age = 37;
const isMarried = false;
const text = `Nome: ${user} Idade: ${age} Casado: ${isMarried}`;
console.log(text); // Nome: Tom Idade: 37 Casado: falseAlém disso, strings com crases suportam múltiplas linhas:
const text = `Todos nós aprendemos um pouco
De alguma coisa e de algum modo,
Assim, com a educação, graças a Deus,
Não é difícil brilhar para nós.`;
console.log(text);Saída no console do navegador:
Todos nós aprendemos um pouco De alguma coisa e de algum modo, Assim, com a educação, graças a Deus, Não é difícil brilhar para nós.
Undefined e Null
Undefined
O tipo Undefined indica que uma variável foi declarada, mas ainda não recebeu um valor. Quando isso acontece, seu valor padrão é undefined.
Por exemplo, ao declarar uma variável sem atribuir um valor, ela automaticamente recebe undefined:
let email;
console.log(email); // undefinedNull
Atribuir o valor null representa a ausência intencional de um valor:
let email;
console.log(email); // undefined
email = null;
console.log(email); // nullVale notar que, embora seja tecnicamente possível atribuir o valor undefined a uma variável, como no caso a seguir:
let email = "tome@mimimail.com";
email = undefined; // atribuindo undefined explicitamente
console.log(email); // undefinedIsso não é recomendado, pois o JavaScript já atribui undefined automaticamente para variáveis não inicializadas. Se for necessário indicar que uma variável não possui valor intencionalmente, o ideal é utilizar null.
Resumo prático:
- Use
undefinedquando uma variável não foi inicializada. - Use
nullpara indicar que a variável não possui valor de forma intencional.
Object
O tipo Object representa uma estrutura de dados mais complexa, permitindo armazenar coleções de valores. A forma mais simples de definir um objeto é utilizando chaves {}:
const user = {};Objetos podem conter propriedades e métodos:
const user = { name: "Tom", age: 24 };
console.log(user.name); // TomOs valores dentro do objeto podem ser de diferentes tipos, como números, strings, arrays e até mesmo outros objetos.
Uma explicação mais detalhada sobre objetos será explorada nos próximos artigos.
Tipagem Fraca e Dinâmica
O JavaScript é uma linguagem de tipagem fraca e dinâmica, o que significa que uma variável pode mudar de tipo ao longo do código.
Exemplo:
let id; // tipo undefined
console.log(id);
id = 45; // tipo number
console.log(id);
id = "45"; // tipo string
console.log(id);Embora o console exiba 45 nas duas últimas atribuições, no segundo caso a variável é um número, e no terceiro caso, uma string.
Isso acontece porque o JavaScript converte os tipos automaticamente quando necessário.
Operador typeof
O operador typeof permite verificar o tipo de um valor ou variável:
let id;
console.log(typeof id); // "undefined"
id = 45;
console.log(typeof id); // "number"
id = 45n;
console.log(typeof id); // "bigint"
id = "45";
console.log(typeof id); // "string"⚠️ Nota:
typeof nullretorna"object", apesar denullser um tipo primitivo. Isso é um erro histórico do JavaScript.
Resumo
numberé usado para representar valores numéricos inteiros e de ponto flutuante.O intervalo seguro para números inteiros vai de -(2⁵³ - 1) até (2⁵³ - 1). Para valores acima desse intervalo, o tipo
BigIntdeve ser utilizado.É possível representar números em bases binária, octal e hexadecimal.
booleanrepresenta valores lógicostrueefalse.stringpode ser definido com aspas simples, duplas ou crases e suporta interpolação e múltiplas linhas.undefinedé atribuído automaticamente quando uma variável não recebe valor, enquantonullrepresenta ausência de valor intencional.objectarmazena coleções de valores e métodos.- O JavaScript possui tipagem dinâmica e fraca, permitindo que variáveis mudem de tipo.
- O operador
typeofé usado para verificar o tipo de uma variável.
Nos próximos artigos, exploraremos cada um desses tipos com mais detalhes, além de aprender a manipulá-los e utilizá-los em diferentes situações.
📝 Exercícios
Adivinhando o resultado do typeof
Leia os exemplos e tente adivinhar o que será impresso no console antes de executar.
console.log(typeof 42);
console.log(typeof "JavaScript");
console.log(typeof -3.14);
console.log(typeof "123");
console.log(typeof `Olá, mundo!`);Resposta
console.log(typeof 42); // "number"
console.log(typeof "JavaScript"); // "string"
console.log(typeof -3.14); // "number"
console.log(typeof "123"); // "string"
console.log(typeof `Olá, mundo!`); // "string"Interpolação de Strings
Leia os exemplos e tente imaginar como cada string será montada.
const nome = "Ana";
console.log(`Meu nome é ${nome}`);
console.log(`Tenho ${25} anos.`);
console.log(`${"JavaScript"} é incrível!`);Resposta
const nome = "Ana";
// nome é uma variável que armazena o valor "Ana"
console.log(`Meu nome é ${nome}`); // Meu nome é Ana
// 25 é um valor numérico
console.log(`Tenho ${25} anos.`); // Tenho 25 anos.
// "JavaScript" é uma string
console.log(`${"JavaScript"} é incrível!`); // JavaScript é incrível!