Оператор in проверяет, существует ли свойство в объекте или его цепочке прототипов. Метод hasOwnProperty() проверяет только собственные свойства объекта, игнoring унаследованные. Главное отличие: in видит всё, hasOwnProperty только своё.
В JavaScript есть два способа проверить наличие свойства в объекте: оператор [in] и метод hasOwnProperty(). Они похожи, но имеют важное отличие.
Проверяет свойство в объекте и его прототипах:
const obj = { name: 'Иван' };
console.log('name' in obj); // true
console.log('toString' in obj); // true (унаследованное)Проверяет только собственные свойства объекта:
const obj = { name: 'Иван' };
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('toString')); // falseconst user = { name: 'Иван' };
// Проверка с in
if ('toString' in user) {
console.log('toString есть'); // Сработает
}
// Проверка с hasOwnProperty
if (user.hasOwnProperty('toString')) {
console.log('toString есть'); // Не сработает
}const obj = {};
// Все объекты имеют унаследованные методы
console.log('toString' in obj); // true
console.log(obj.hasOwnProperty('toString')); // falseconst parent = { inherited: 'value' };
const child = Object.create(parent);
child.own = 'value';
console.log('inherited' in child); // true (через прототип)
console.log(child.hasOwnProperty('inherited')); // false (не своё)// ❌ Думаем, что toString свойство объекта
const obj = {};
if (obj.hasOwnProperty('toString')) {
console.log('Есть toString');
} else {
console.log('Нет toString'); // Сработает правильно
}
// ✅ Правильная проверка для общего случая
if ('toString' in obj) {
console.log('Можно использовать toString'); // Сработает
}// ❌ Пропускаем унаследованные методы
const obj = { name: 'Иван' };
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// Пропустили toString и другие методы
}
}
// ✅ Если нужны все свойства
for (let key in obj) {
if (key in obj) {
// Будет работать, но бессмысленно
// Лучше без проверки
}
}Понимание разницы между in и hasOwnProperty помогает правильно работать с объектами и избегать ошибок с наследованными свойствами.
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪