in учитывает и унаследованные свойства. Object.hasOwn() — только собственные. Прямой obj.hasOwnProperty лучше не вызывать.
Подробности
const obj = { key: 'value' };
if ('key'in obj) {
console.log('есть (своё или унаследованное)');
}
if (Object.hasOwn(obj, 'key')) {
console.log('есть собственное');
}
obj.hasOwnProperty может быть переопределён или отсутствовать у объектов с null-прототипом — безопаснее Object.hasOwn / Object.prototype.hasOwnProperty.call.
Проверка obj.key !== undefined ломается, если свойство есть, но равно undefined.
Итог
Нужна цепочка прототипов — in; только own — Object.hasOwn.
Как проверить, есть ли у объекта определённое свойство? · Sobeso