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.