Como verificar se um objeto possui uma propriedade?

Em JavaScript, existem várias maneiras de verificar se um objeto possui uma propriedade específica. Entender esses métodos é importante para trabalhar de forma eficaz com objetos, especialmente quando você está lidando com dados de fontes externas ou quando precisa garantir que certas propriedades existam antes de usá-las. Exploraremos algumas abordagens comuns: o hasOwnProperty() método, o Object.hasOwn() método, o operador in e a verificação contra undefined. Vamos começar com o método hasOwnProperty(). Este método retorna um booleano indicando se o objeto possui a propriedade especificada como sua própria propriedade. Aqui está um exemplo:
const person = {
  name: "Alice",
  age: 30
};

console.log(person.hasOwnProperty("name")); // true
console.log(person.hasOwnProperty("job")); // false
Neste exemplo, temos um objeto chamado person com duas propriedades: name e age. Para verificar se name é uma propriedade do objeto person, usamos o método hasOwnProperty(). Como name é uma propriedade, ele retornará true. Mas quando usamos o hasOwnProperty() para verificar se job é uma propriedade, ele retornará false porque não existe no objeto. Object.hasOwn() é a forma moderna e recomendada de verificar se um objeto possui uma propriedade como sua própria (não herdada). Pense nisso como uma versão atualizada e mais segura de hasOwnProperty(). A sintaxe é Object.hasOwn(object, propertyName) — você passa o objeto como o primeiro argumento e o nome da propriedade como o segundo. Aqui está um exemplo básico:
const person = {
  name: "Alice",
  age: 30
};

console.log(Object.hasOwn(person, "name")); // true
console.log(Object.hasOwn(person, "job")); // false
Neste exemplo, Object.hasOwn(person, "name") retorna true porque name existe diretamente no person objeto. Object.hasOwn(person, "job") retorna false porque job nunca foi adicionado ao objeto. Uma coisa muito importante para entender é que Object.hasOwn() apenas verifica se a propriedade existe — ele não se importa com o valor da propriedade. Isso significa que ele ainda retorna true mesmo quando o valor é 0, false, null ou undefined:
const user = {
  username: "coder123",
  score: 0,
  isActive: false,
  nickname: null
};

// Object.hasOwn() correctly reports these all exist
console.log(Object.hasOwn(user, "score"));    // true  (value is 0, but property exists)
console.log(Object.hasOwn(user, "isActive")); // true  (value is false, but property exists)
console.log(Object.hasOwn(user, "nickname")); // true  (value is null, but property exists)
console.log(Object.hasOwn(user, "email"));   // false (property was never added)

// Danger! Using if() directly gives wrong results for falsy values
if (user.score) {
  console.log("Has score"); // This will NOT print even though score exists!
}

// Safe! Object.hasOwn() gives correct result
if (Object.hasOwn(user, "score")) {
  console.log("Has score:", user.score); // Has score: 0
}
Outra forma de verificar a existência de uma propriedade em um objeto é usar o operador in. Como hasOwnProperty(), o operador in retornará true se a propriedade existir no objeto. Aqui está como você pode usá-lo:
const person = {
  name: "Bob",
  age: 25
};
console.log("name" in person);  // true
Neste exemplo, "name" in person retorna true porque name é uma propriedade de person. O terceiro método envolve verificar se uma propriedade é undefined. Esta abordagem pode ser útil, mas tem algumas limitações. Aqui está um exemplo:
const car = {
  brand: "Toyota",
  model: "Corolla",
  year: 2020
};

console.log(car.brand !== undefined); // true
console.log(car.color !== undefined); // false
Neste código, verificamos se car.brand e car.color não são undefined. Isso funciona porque acessar uma propriedade inexistente em um objeto retorna undefined. No entanto, este método pode gerar falsos negativos se uma propriedade explicitamente tiver o valor undefined. Na prática, a escolha entre esses métodos geralmente depende dos requisitos específicos do seu código. Entender as diferenças entre eles ajudará você a fazer a escolha certa em diferentes cenários.
Este módulo não possui perguntas. Marque como concluído.