Desafio JavaScript
Verificador de tipos primitivos
Enunciado
Crie uma função tipoPrimitivo(valor) que retorne uma string indicando o tipo primitivo do valor. Ela deve tratar corretamente null (retornar "null" em vez de "object"), bigint e symbol. Para valores não primitivos (objetos, arrays, funções), deve retornar "objeto" ou "funcao" conforme o caso. Depois, teste a função com pelo menos 7 valores diferentes e imprima os resultados no formato valor -> tipo.
Requisitos
- A função deve retornar
"null"paranull. - A função deve retornar
"bigint"e"symbol"corretamente usandotypeof. - A função deve retornar
"funcao"para funções e"objeto"para objetos e arrays. - O programa deve testar a função com pelo menos 7 valores e imprimir cada resultado no formato
valor -> tipo.
Código inicial
function tipoPrimitivo(valor) {
// Implemente a lógica
}
// Testes
Saída esperada
Ana -> string
25 -> number
true -> boolean
null -> null
undefined -> undefined
9007199254740993n -> bigint
Symbol(id) -> symbol
[1,2] -> objeto
function(){} -> funcao
Ver dica
Use typeof para a maioria dos casos. Para null, verifique explicitamente valor === null. Para diferenciar função de objeto, use typeof valor === 'function'.
Mostrar solução
function tipoPrimitivo(valor) {
// Trata null explicitamente, pois typeof null retorna 'object'
if (valor === null) return 'null';
const tipo = typeof valor;
// Funções são um caso especial de objeto
if (tipo === 'function') return 'funcao';
// Objetos (incluindo arrays) não são primitivos
if (tipo === 'object') return 'objeto';
// Demais tipos primitivos: string, number, boolean, undefined, bigint, symbol
return tipo;
}
// Testes
const valores = [
'Ana',
25,
true,
null,
undefined,
9007199254740993n,
Symbol('id'),
[1, 2],
function() {}
];
for (const v of valores) {
console.log(`${String(v)} -> ${tipoPrimitivo(v)}`);
}
Passo a passo
- A função
tipoPrimitivorecebe um valor e primeiro verifica se énullcomvalor === null, retornando'null'. - Em seguida, obtém o tipo com
typeof valor. - Se o tipo for
'function', retorna'funcao'. - Se o tipo for
'object'(e não for null, já tratado), retorna'objeto'. - Caso contrário, retorna o próprio tipo, que será
'string','number','boolean','undefined','bigint'ou'symbol'. - No array de testes, incluímos valores de todos os tipos primitivos e também um array e uma função.
- O loop percorre o array e imprime cada valor formatado com
String(v)e o resultado da função.
Por que funciona
A função contorna a peculiaridade de typeof null com uma verificação explícita. Também separa funções de objetos, pois embora funções sejam objetos em JavaScript, typeof as identifica como 'function'. Para os demais primitivos, typeof já retorna o nome correto. Assim, a função classifica corretamente todos os casos solicitados.
Erros comuns
- Esquecer de tratar
nullantes detypeof:typeof nullretorna'object', então a função retornaria'objeto'incorretamente. - Usar
valor instanceof Objectpara detectar objetos: arrays e funções também são instâncias de Object, mas a função deve diferenciá-los. Melhor usartypeof. - Não converter o valor para string ao imprimir:
Symbolnão pode ser concatenado diretamente com+(lançaTypeError). Use template string ouString(v).
Outra forma de resolver
Usar Object.prototype.toString.call(valor) para obter o tipo interno, que retorna [object Null], [object Array], etc. Exemplo:
function tipoPrimitivo(valor) {
const tag = Object.prototype.toString.call(valor);
if (tag === '[object Null]') return 'null';
if (tag === '[object Array]') return 'objeto';
// ...
}
Preferível quando se precisa distinguir arrays de objetos comuns, mas é mais verboso.
Saída esperada
Ana -> string
25 -> number
true -> boolean
null -> null
undefined -> undefined
9007199254740993n -> bigint
Symbol(id) -> symbol
[1,2] -> objeto
function(){} -> funcao