Почему лучше использовать hasOwnProperty в JavaScript?

«Почему лучше использовать hasOwnProperty в JavaScript?» — вопрос из категории JavaScript, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод hasOwnProperty() проверяет, принадлежит ли свойство непосредственно самому объекту, а не его цепочке прототипов. Это критически важно для корректного перебора и проверки свойств, особенно при использовании for...in.

Пример проблемы без hasOwnProperty:

const user = { name: 'Alice', age: 30 };

// Проверка через 'in' даёт ложное срабатывание
console.log('toString' in user); // true (свойство унаследовано от Object.prototype)
console.log('valueOf' in user);  // true (также унаследовано)

// Корректная проверка через hasOwnProperty
console.log(user.hasOwnProperty('name'));    // true
console.log(user.hasOwnProperty('toString')); // false

Безопасное использование в цикле for...in:

for (const key in user) {
  if (user.hasOwnProperty(key)) {
    console.log(`${key}: ${user[key]}`); // Выведет только 'name' и 'age'
  }
}

Важное замечание: Сам метод hasOwnProperty может быть переопределён в объекте. Для абсолютной надёжности используйте:

Object.prototype.hasOwnProperty.call(user, 'name');
// или в современных средах
Object.hasOwn(user, 'name');