Trilhas
/
JavaScript
JavaScript
/
Programa
/
Verificação de tipos
Ve

Verificação de tipos em JavaScript

1 exercício

Sobre Verificação de tipos

Saber qual é o tipo de um dado costuma ser muito importante para que o código rode sem problemas e sem erros.

O JavaScript tem várias formas de verificar o tipo de um valor ou de um objeto.

Note

Os mecanismos de verificação de tipos do JavaScript podem ser um tanto não confiáveis.

Para uma segurança de tipos melhor e tipos mais fortes, você provavelmente deveria usar TypeScript, uma linguagem que se baseia no JavaScript, mas com a sintaxe de tipos de uma linguagem de tipagem estática.

O operador typeof

O operador typeof retorna o tipo do seu operando. A saída é uma string que corresponde ao nome de um dos tipos de dados primitivos, exceto por "null". Também pode ser "function" ou "object".

typeof undefined;
// => "undefined"

typeof true;
// => "boolean"

typeof 42;
// => "number"

typeof 'Hello, World!';
// => "string"

typeof function () {
  return 'Hello, World';
};
// => "function"

typeof [1, 2, 3, 4];
// => "object"

typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"

Por [razões históricas][typeof null is "object"].

O operador instanceof

Para verificar o tipo de um objeto, você pode usar o operador instanceof. Ele é avaliado como um boolean dependendo de se o segundo operando está incluído na cadeia de protótipos do primeiro operando. Para deixar claro, instanceof retorna se o primeiro operando é uma instância do segundo operando ou de uma de suas classes filhas. instanceof só funciona com objetos.

class Beverage {
  // ...
}

// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
  // ...
}

const java = new Coffee();

java instanceof Coffee;
// => true

java instanceof Beverage;
// => true
Advanced

A classe Array tem um método chamado Array.isArray() que verifica se o seu argumento é um array.

Enquanto instanceof Array não funciona com um array criado em outro realm, como um iframe em uma página web, Array.isArray() funciona.

Isso acontece porque a classe Array tem um construtor diferente em cada realm, e cada iframe tem o seu próprio realm, o que significa que a função na cadeia de protótipos será diferente, fazendo com que instanceof Array falhe. Array.isArray() consegue ignorar isso e deve sempre ser usado quando possível.

Ele também consegue sobreviver a falsos positivos, em que um objeto não é de fato um Array, mas apenas tem Array na sua cadeia de protótipos.

({ __proto__: Array.prototype }) instanceof Array
// => true

Array.isArray({ __proto__: Array.prototype })
// => false

O operador in

O operador in retorna se o primeiro operando é uma propriedade do segundo operando. Ele não verifica se a propriedade tem um valor definido. Uma propriedade definida como undefined ainda será detectada pelo in.

class Coffee {
  constructor() {
    this.temperature = 'hot';
    this.isDarkMatter = undefined;
  }

  coolDown() {
    this.temperature = 'warm';
  }
}

const espresso = new Coffee();

'temperature' in espresso;
// => true

'color' in espresso;
// => false

'isDarkMatter' in espresso;
// => true
Note

O in retorna true para propriedades e métodos herdados.

"coolDown" in espresso
// => true

"constructor" in espresso
// => true

Para evitar isso, use Object.hasOwn() em vez disso

A função Object.hasOwn()

O método Object.hasOwn() retorna se o objeto especificado possui a propriedade em questão (ela não é herdada nem é um método).

class Coffee {
  constructor() {
    this.temperature = 'hot';
  }

  coolDown() {
    this.temperature = 'warm';
  }
}
const cappuccino = new Coffee();

Object.hasOwn(cappucino, 'temperature');
// => true

Object.hasOwn(cappucino, 'constructor');
// => false

Object.hasOwn(cappucino, 'coolDown');
// => false
Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Verificação de tipos