Проверьте, не является ли что-то не определенным в JavaScript


224

Я проверяю if(response[0].title !== undefined), но я получаю ошибку:

Uncaught TypeError: Невозможно прочитать свойство 'title' из undefined.


Смотрите ответ здесь в stackoverflow. stackoverflow.com/questions/858181/…
Луис Валенсия

Ответы:


344

response[0] не определен, проверьте, определен ли он, а затем проверьте его заголовок свойства.

if(typeof response[0] !== 'undefined' && typeof response[0].title !== 'undefined'){
    //Do something
}

20
Несмотря на количество голосов, это не хороший способ выполнить проверку, потому что undefinedэто не ключевое слово JavaScript (хотя, кажется, все думают, что это так). Если вы хотите, вы можете создать переменную с именем, undefinedи тогда эта проверка будет неправильной. Единственный правильный способ - это проверить (typeof myVar !== 'undefined').
BadHorsie

4
@BadHorsie имеет смысл, я обновил ответ с вашим комментарием.
Амосривера

1
Что если переменная существует и содержит строку, которая читается как «неопределенная»?
TomeeNS

1
@BadHorsie Ваш аргумент является поддельным. Почему я должен переопределить undefined?
Роберт Симер

1
@amosrivera Нет, его / ее комментарий не имеет смысла. Вы ухудшили свой ответ.
Роберт Симер

40

Просто проверьте, response[0]не определено ли:

if(response[0] !== undefined) { ... }

Если вам все еще нужно явно проверить заголовок, сделайте это после начальной проверки:

if(response[0] !== undefined && response[0].title !== undefined){ ... }

35

У меня были проблемы со всеми другими примерами кода выше. В Chrome это было условие, которое работало для меня:

typeof possiblyUndefinedVariable !== "undefined"

Мне придется проверить это в других браузерах и посмотреть, как идут дела, я полагаю.


2
То же самое - я обнаружил, undefinedчто должна быть строка.
Restrh

это должно быть что-то новое с Chrome (я на Win Chrome 41 АТМ). принятый ответ работал просто отлично! : P
Джо

13

На самом деле вы должны окружить его блоком Try / Catch, чтобы ваш код не переставал работать. Как это:

try{
    if(typeof response[0].title !== 'undefined') {
        doSomething();
    }
  }catch(e){
    console.log('responde[0].title is undefined'); 
  }

Я смотрел на IE 8 и должен был сделать попытку поймать.
RonanOD

1
это лучший способ, если вы тестируете, если функция не определена
edepperson

выдача ошибки для проверки undefined не является хорошим решением. @amosrivera - лучшее решение.
user3658423

@ user3658423: Ошибка не выдается. Он только предотвращает остановку скрипта, если ответ не объявлен (потому что это приведет к ошибке).
Андре Луис

Иногда ошибки могут быть полезны. С вашим предложенным решением, если doSomething () генерирует исключение, все, что вы увидите в своей консоли, это «responsede [0] .title не определен» вместо полезного сообщения о «не пойманном исключении @ строка 123 файла xyz». .js». В конце концов, второй разработчик, вероятно, закомментирует оператор console.log (), что усложнит задачу третьего разработчика войти и исправить ошибку, происходящую глубоко внутри doSomething ().
Эрик Сизранд,




0

Проверьте, существуете ли вы на response[0]самом деле, похоже, что ошибка не существует.


0

Сначала вы должны проверить, response[0]является ли неопределенным, и только если это не так, проверьте все остальное. Это означает, что в вашем случае response[0]не определено.


0

Я знаю, что я приехал сюда на 7 месяцев позже, но я нашел эти вопросы, и это выглядит интересно. Я попробовал это на моей консоли браузера.

try{x,true}catch(e){false}

Если переменная x не определена, ошибка отлавливается, и она будет ложной, в противном случае она вернет true. Таким образом, вы можете использовать функцию eval, чтобы установить значение переменной

var isxdefined = eval('try{x,true}catch(e){false}')

1
Интересный подход, если можно так сказать сам.
Брандито

0

В некоторых из этих ответов есть фундаментальное недоразумение о том, как использовать typeof.

некорректный

if (typeof myVar === undefined) {

Верный

if (typeof myVar === 'undefined') {

Причина в том, что typeofвозвращает строку. Следовательно, вы должны убедиться, что она вернула строку «undefined», а не undefined(не заключенную в кавычки), которая сама по себе является одним из примитивных типов JavaScript . typeofОператор никогда не возвращает значение типа undefined.


добавление

Ваш код может технически работать, если вы используете неправильное сравнение, но, вероятно, не по той причине, о которой вы думаете. В undefinedJavaScript нет ранее существовавшей переменной - это не какое-то волшебное ключевое слово, с которым можно сравнивать вещи. Вы можете создать переменную с именем undefinedи присвоить ей любое значение.

let undefined = 42;

И вот пример того, как вы можете использовать это, чтобы доказать, что первый метод неверен:

https://jsfiddle.net/p6zha5dm/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.