Aprenda a utilizar o método hasOwnProperty do JavaScript

O método hasOwnProperty do JavaScript é usado para verificar se um determinado objeto possui uma propriedade específica.

A propriedade verificada pelo método hasOwnProperty é interna ao objeto em questão, ou seja, ela deve ter sido definida pelo usuário.

Se a propriedade passada para o hasOwnProperty existir no objeto, o método retorna true, do contrário, retorna false.

Exemplo 1:

Nesse exemplo, nós criamos o objeto person e adicionamos a propriedade name, logo em seguida, usamos o hasOwnProperty para verificar se essa propriedade faz parte do nosso objeto.

1var person = {
2    "name": "Brian",
3    "lastName": "Scott"
4};
5
6console.log( person.hasOwnProperty("name") );

Saída:

1true

Exemplo 2:

Nesse exemplo, vamos declarar um objeto com o nome car e atribuir uma propriedade a ele chamada doors, assim podemos usar o hasOwnProperty para verificar essa propriedade.

1var car = {
2    "doors": 4,
3    "engine": 2.0,
4    "color": "black"
5};
6
7var hasDoor = car.hasOwnProperty("doors");
8
9console.log(hasDoor);

Saída:

1true

Exemplo 3:

Aqui nós vamos, propositalmente, errar o nome da propriedade do nosso objeto para que o método hasOwnProperty retorne false.

1var shoppingCart = {
2    "fruits": true,
3    "bread": false
4};
5
6var hasFruits = shoppingCart.hasOwnProperty("fruites");
7
8console.log(hasFruits);

Saída:

1false

Por que é importante usar o método hasOwnProperty?

Vamos analisar a importância de usar o método hasOwnProperty para verificar se uma propriedade existe dentro de um objeto em JavaScript.

Tudo em JavaScript é um objeto.

Isso mesmo, qualquer elemento criado no JavaScript é considerado um objeto. Números, Strings de texto, Arrays e qualquer outro tipo de dado do JavaScript herda propriedades de um objeto superior.

Exemplo 1:

O tipo de dado numérico em JavaScript é considerado um objeto.

1var number = 10.22333;
2var otherNumber = number.toPrecision(3);
3
4console.log(otherNumber);

Saída:

110.2

Exemplo 2:

O tipo de dado string, também é considerado um objeto.

1var name = "Peter Max";
2var char = name.charAt(2);
3
4console.log(char);

Saída:

1t

Exemplo 3:

Até arrays em JavaScript são objetos.

1var cars = ["BMW", "Audi", "Aston Martin"];
2
3var carIndexNumber = cars.indexOf("BMW");
4
5console.log(carIndexNumber);

Saída:

10

Nos exemplos anteriores, todos os objetos herdam propriedades do objeto principal, o Object.

O comando “in” em JavaScript

Normalmente os programadores novatos em JavaScript usam o comando in para verificar se uma propriedade existe em um determinado objeto.

Exemplo:

 1var car = {
 2    "doors": 2,
 3    "engine": 1.2,
 4    "color": "yellow"
 5};
 6
 7if ("engine" in car) {
 8    console.log("true");
 9} else {
10    console.log("false");
11}

Saída:

1true

O problema é que o comando in é abrangente. Ele fará uma busca por todas as propriedades do objeto. As propriedades criadas pelo usuário e as propriedades herdadas do objeto superior são incluídas na checagem.

Isso pode causar um erro de lógica se por acaso o programador executar um pedaço do código somente se uma propriedade do objeto existir.

Mas o programador quer verificar uma propriedade padrão do objeto? Ou uma propriedade criada pelo usuário?

Exemplo:

 1var car = {
 2    "doors": 2,
 3    "engine": 1.2,
 4    "color": "yellow"
 5};
 6
 7if ("toString" in car) {
 8    console.log("true");
 9} else {
10    console.log("false");
11}

Saída:

1true

No exemplo anterior, o comando in retorna true, ou seja, ele considera que a propriedade toString existe no nosso objeto, mesmo que essa propriedade não tenha sido declarada por nós.

A propriedade/método toString é herdade do objeto superior. Para evitar essa confusão sempre use o método hasOwnProperty.

Exemplo:

 1var car = {
 2    "doors": 2,
 3    "engine": 1.2,
 4    "color": "yellow"
 5};
 6
 7if ( car.hasOwnProperty("toString") ) {
 8    console.log("true");
 9} else {
10    console.log("false");
11}

Saída:

1false

Agora o retorno foi o valor false. Isso porque, como vimos anteriormente, o método hasOwnProperty, somente pesquisa as propriedades definidas pelo usuário.