Проверка на наличие объекта javascript

117
15 апреля 2018, 23:44

После ajax запроса function(data) проверяю наличие нужного объекта.

..., function(data)
{
    if (typeof(data.ads.photo) == "undefined")
        {
           console.log ('есть фото');
        }
    else
       {
          console.log ('нет фото');
       }
}

В чём проблема. Такая проверка не заходит ни в if ни в else

Но если поставить проверку:

if (typeof(data.ads) == "undefined")

тогда показывать наличие или отсутствие. Что может быть не так?

Answer 1

Так как data.ads неопределено, попытка обращения к data.ads.photo вызывает исключение, прерывающее исполнение кода.

if (!data || !data.ads || !data.ads.photo)
{
   console.log ('нет фото');
}
else
{
   console.log ('есть фото');
}
Answer 2

Причина названа в ответе @Igor, я лишь предложу более изящное решение:

..., function(data) {
  let photo, something; 
  try {
    photo = data.ads.photo; 
    something = data.ads.something;  // получение еще каких-либо данных из полей data
  } catch (err) {
    console.log ('опаньки... ' + err.message);
    return; 
  }
  ... // делаем что-то с photo и прочими значениями из data. Если код здесь тоже небезопасен, то его можно перенести в тело try
}

var rslt = document.getElementById('result'),  
    btns = document.querySelectorAll('.test-btn');  
for (let btn of btns) 
  btn.addEventListener('click', fetchData);  
 
function fetchData(e) { 
  console.clear();  
  rslt.textContent = '\tПолучение данных... ';  
  fetch('https://httpbin.org/get').then(r => r.json()).then(data => { 
    let ip, ua, notExists;  
    try { 
      ip = data.origin;  
      ua = data.headers['User-Agent'];  
      if (e.target.id === 'test-two') 
        notExists = data.noObject.noValue; // тут будет ошибка, и выполнение перейдет в catch  
      rslt.textContent += `OK\n IP:${ip}\n UA:${ua}\n`;  
    } catch (err) { 
      rslt.textContent += 'ошибка!\n';  
      console.log(err.stack);  
    } 
    rslt.textContent += '\tЗавершено.';  // выполняется вне зависимости от ошибок в try 
  });  
}
#result { 
  height: 100px; overflow-y: auto;  
  font: 14px monospace; white-space: pre-wrap; 
  background-color: #222; color: #4d4; 
}
<button id="test-one" class="test-btn">Обычный тест</button> 
<button id="test-two" class="test-btn">Тест с ошибкой</button> 
<pre id="result"></pre>

READ ALSO
PhpStorm и watcher Babel, как установить и настроить?

PhpStorm и watcher Babel, как установить и настроить?

Через консоль PhpStorm выполняю установку: npm install --save-dev babel-cli, установился в корень настоящего проекта

162
Открытие ссылки в новой вкладке из iframe

Открытие ссылки в новой вкладке из iframe

Нужен совет или пикон в нужную сторону

135
добавить элемент в список

добавить элемент в список

В чем ошибка?пишет, что pushAlphabet не определен в HTMLInputElementonclic

153