Separating Own From Inherited

The for..in loop iterates over ALL enumerable properties — including those inherited from the prototype chain.

let animal = { eats: true };
let rabbit = { name: 'Rabbit', __proto__: animal };

for (let key in rabbit) {
  console.log(key); // Logs "name" AND "eats" (inherited!)
}

Solution 1: hasOwnProperty Check

for (let key in rabbit) {
  if (rabbit.hasOwnProperty(key)) {
    console.log('Own property: ' + key); // Only "name"
  }
}

Solution 2: Modern Object Methods (Recommended)

Object.keys(), Object.values(), Object.entries() return only own properties automatically:

console.log(Object.keys(rabbit)); // ['name'] — no 'eats'!
Tip

Prefer Object.keys() over for..in when you only want own properties — it's simpler and safer.