Подтвердить что ты не робот

Как проверить, существует ли свойство в потенциально undefined объекте?

Итак, есть вопросы по S.O. ответьте, как проверить, существует ли свойство на объекте. Пример Ответ заключается в использовании Object.prototype.hasOwnProperty().

Однако как вы можете проверить свойство потенциально undefined объекта?

Если бы нужно было попытаться только непосредственно проверить, если свойство существует на объекте undefined, то это будет ссылка ошибка.

Семантически, лучше проверить код непосредственно if (obj.prop) //dosomething - он показывает более четкое намерение. Есть ли способ достичь этого? Предпочтительно, есть ли встроенный Javascript-метод для выполнения такой вещи или по соглашению?

Мотив: Пакет добавляет свойство user.session.email - но я проверяю, существует ли почта, а не сеанс, хотя сеанс может быть несуществующим.

Обновление:. Многие ответы говорят об использовании && оператора для короткого замыкания. Я знаю, что это возможное решение, но это не совсем то, что нужно, поскольку кажется, что мы работаем над внешним синтаксисом объекта JS - то есть, хотя вы хотите действительно проверить свойство на объекте, вы вынуждены проверять, существует ли объект для этого.

Примечание для маркировки как закрытого. Почему это было отмечено как закрытое? Ссылка, которая предполагает, что это дубликат, может не дать одинаковых ответов. Мы ищем лучшее, более семантическое решение и отмечаем это закрытое предположение "вложенное" === "потенциально undefined"?

4b9b3361

Ответ 1

Если вы уверены, что существует родительский объект, то:

if(obj && obj.key) {
  console.log(obj.key);
}

Однако, этот пример потерпит неудачу, если obj не существует.

if (obj && obj.key) {
  console.log(obj.key);
}

Ответ 2

если вы хотите проверить, что оба obj и prop существуют (как вы упомянули в своих комментариях), вам нужно сделать:

if(obj && obj.hasOwnProperty('some')) или if(obj && obj.some)

Как уже упоминалось в комментариях, это приведет к ошибке, если obj undefined. Лучшее сравнение было бы:

if(typeof obj != "undefined" && obj.hasOwnProperty('some'))

Ответ 3

Вы можете сделать что-то вроде:

if(user.session && 'email' in user.session) //do something...

если вы уверены, что пользователь определен.