Лучше всего использовать in или hasOwnProperty(). Твои примеры не работают - ключ может быть, но со значением undefined или null. Делай так: 'key' in myObj или myObj.hasOwnProperty('key'). Первый проверяет всю цепочку прототипов, второй - только свои свойства. Я почти всегда беру hasOwnProperty().
У меня тоже была такая проблема пару месяцев назад! Твои варианты не очень надежные – могут выдать странные результаты. Я использую Object.hasOwnProperty() или новый метод Object.hasOwn() – он более безопасен, чем hasOwnProperty. Еще можно использовать Object.keys(myObj).includes('key'), но это медленнее для больших объектов. Не стоит заморачиваться с проверками на undefined/null – это может привести к ошибкам.
А я обычно Object.keys(myObj).includes('key') использую. Да, медленно работает, но зато понятно. Кстати, если ключ есть, но значение false или 0 - твой третий способ не сработает, так?