В чём разница между оператором 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).