PassFront
  1. PassFront
  2. База знаний
  3. Объекты и прототипы

В чём разница между оператором in и методом hasOwnProperty?

Объекты и прототипы

`in` проверяет наличие свойства у объекта и по всей цепочке прототипов, а `hasOwnProperty` — только собственные свойства объекта.

const base = { inherited: 1 };
const obj = Object.create(base);
obj.own = 2;

'own' in obj;                 // true
'inherited' in obj;           // true
obj.hasOwnProperty('own');       // true
obj.hasOwnProperty('inherited'); // false

Нюансы

  • in видит и методы из прототипа: 'toString' in {} — true.
  • Значение undefined не мешает проверке: ({ a: undefined }) даёт 'a' in obj === true, а obj.a !== undefined — false.
  • У объекта без прототипа (Object.create(null)) нет hasOwnProperty. Надёжнее статический Object.hasOwn(obj, key) (ES2022) или Object.prototype.hasOwnProperty.call(obj, key).
  • in работает и с массивами: 1 in [10, 20] — true (проверяет индекс).
  • for...in перебирает и унаследованные перечисляемые свойства, поэтому часто добавляют проверку Object.hasOwn.

Коротко для собеседования

in проверяет всю цепочку прототипов, hasOwnProperty и Object.hasOwn — только собственные свойства. Для безопасной проверки используют Object.hasOwn(obj, key).

Другие вопросы раздела