Перевірте, чи щось не визначено в JavaScript


224

Я перевіряю if(response[0].title !== undefined), але я отримую помилку:

Uncaught TypeError: Неможливо прочитати властивість "title" невизначеного.


Дивіться відповідь тут у stackoverflow. stackoverflow.com/questions/858181/…
Луїс Валенсія

Відповіді:


345

response[0] не визначено, перевірте, чи він визначений, а потім перевірте його назву властивості.

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

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

4
@BadHorsie має сенс, я оновив відповідь з вашим коментарем.
amosrivera

1
Що робити, якщо існує змінна і містить рядок, що читає "невизначений"?
TomeeNS

@BadHorsie Ваш аргумент хибний. Чому я повинен переглядати undefined?
Роберт Сімер

@amosrivera Ні, його коментар не мав сенсу. Ви погіршили свою відповідь.
Роберт Сімер

39

Просто перевірте, чи response[0]не визначено:

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

Якщо вам все-таки потрібно чітко перевірити заголовок, зробіть це після первинної перевірки:

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

35

У мене виникли проблеми з усіма іншими прикладами коду вище. У Chrome ця умова працювала для мене:

typeof possiblyUndefinedVariable !== "undefined"

Мені доведеться перевірити це в інших браузерах і побачити, як ідуть справи, я думаю.


2
Те саме - я виявив, що undefinedце повинна бути струна.
ремарш

це повинно бути щось нове з хромом (я на 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

кидання помилки для перевірки невизначеного не є хорошим рішенням. @amosrivera - найкраще рішення.
користувач3658423

@ user3658423: Це не помилка. Він заважає зупинити сценарій лише у випадку, якщо відповідь не буде оголошено (оскільки це призведе до помилки).
Андре Луїз

Іноді помилки можуть бути корисними. З запропонованим рішенням, якщо doSomething () кидає виняток, все, що ви побачили б у своїй консолі, - це "responde [0] .title is not undefined", а не корисне повідомлення про "un-зловлений виняток @ рядок 123 файлу xyz .js ". Врешті-решт, другий розробник, ймовірно, прокоментує твердження console.log (), що ускладнить вступу третього розробника і виправить помилку, що відбувається в межах doSomething ().
Eric Seastrand




0

Перевірте, чи ви response[0]насправді існуєте, схоже, помилка підказує, що це не так.


0

Спочатку потрібно перевірити, чи response[0]не визначено, і лише якщо це не так, перевірити на решту. Це означає, що у вашому випадку response[0]не визначено.


0

Я знаю, що пішов сюди на 7 місяців із запізненням, але я знайшов це питання, і це виглядає цікаво. Я спробував це на консолі браузера.

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

Якщо змінна x не визначена, помилка вловлюється, і вона буде помилковою, якщо ні, вона поверне справжню. Таким чином, ви можете використовувати функцію 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.