2016-08-25 2 views
10

Итак, есть вопросы по поводу С.О. ответьте, как проверить, существует ли свойство на объекте. Example Ответ заключается в использовании Object.prototype.hasOwnProperty().Как проверить, существует ли свойство в потенциально неопределенном объекте?

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

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

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

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

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

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

+3

Это не будет синтаксическая ошибка, это будет ReferenceError. Вы можете проверить 'obj && obj.prop'. – Xufox

+2

Является ли переменная 'obj' определенно существовать, но может иметь значение' undefined'? Кстати, тестирование 'if (obj.prop)' не проверяет, существует ли свойство, оно проверяет, существует ли свойство * и * имеет правдивое значение. – nnnnnn

+0

Ah - заданное описание вопроса, но вопрос по-прежнему остается в силе, потому что вы по существу проверяете, существуют ли как объект, так и свойство, когда я только пытаюсь проверить, существует ли свойство. – steviejay

ответ

9

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

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

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

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

... поэтому вы можете проверить, если объект определяется при проверке свойства. Это гарантирует, что вы не получите ошибки времени выполнения, если условие было удалено, и объект свойства не был установлен.

if(typeof obj != "undefined" && obj.key) { 
 
    console.log('you will not see this logged') 
 
}

Вы заметите, что приведенный выше пример не исключение.

var obj = {key: 1}; 
 

 
if(typeof obj != "undefined" && obj.key) { 
 
    console.log('we have obj! and val is : ' + obj.key) 
 
}

Это гораздо более оборонительный подход, но он позволяет портативности. Если вы хотите извлечь свою логику в модуль для повторного использования, вы можете проверить, существует ли этот объект, или подвергать риску нежелательные ошибки из области приложения, к которой вы, возможно, не обязательно относитесь.

+0

Если нет более четких способов проверки собственности, я буду принимать это как ответ (представленный другими людьми). – steviejay

+2

Обратите внимание, что 'typeof obj!= "undefined" 'даст опорную ошибку, если' obj' был определен с 'let' или' const' в точке после проверки 'typeof'. – nnnnnn

+4

Обратите внимание, что 'var a = {a: false, b: 0, c: null}' прерывает эти тесты, так как 'aa' и' ab' и 'ac' оценивают как не правдивые, поэтому' if (a && aa) {...} 'не будет думать, что это определено, но это так. – artfulrobot

5

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

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

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

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

Это вызовет исключение, если obj не определен – user1167442

0

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

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

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

Смежные вопросы