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

JavaScript "не может прочитать свойство" bar "из неопределенного

У меня есть функция, которая принимает 3 параметра. У меня проблема в том, что один из параметров является свойством иногда неопределенного значения объекта (т. Е. Оно принимает в себя thing.foo.bar, а иногда thing.foo не определено, поэтому он не может получить доступ к панели).

Какой способ обойти это? В объявлении функции у меня есть условная проверка: if (!parameterName), но браузер (Chrome) по-прежнему выдает ошибку, что он не может прочитать свойство bar undefined.

4b9b3361

Ответ 1

Если свойство объекта может ссылаться на какой-либо другой объект, вы можете проверить его для undefined, прежде чем пытаться использовать его свойства:

if (thing && thing.foo)
   alert(thing.foo.bar);

Я мог бы обновить свой ответ, чтобы лучше отразить вашу ситуацию, если вы показываете какой-то фактический код, но возможно что-то вроде этого:

function someFunc(parameterName) {
   if (parameterName && parameterName.foo)
       alert(parameterName.foo.bar);
}

Ответ 2

Вы можете защитить себя одним из двух способов:

function myFunc(thing) {
    if (thing && thing.foo && thing.foo.bar) {
        // safe to use thing.foo.bar here
    }
}

function myFunc(thing) {
    try {
        var x = thing.foo.bar;
        // do something with x
    } catch(e) {
        // do whatever you want when thing.foo.bar didn't work
    }
}

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

Во втором примере вы просто помещаете вокруг него обработчик исключений. Вы просто получаете доступ к thing.foo.bar при условии, что он существует. Если он существует, то код работает нормально. Если он не существует, тогда он выдает исключение, которое вы поймаете и проигнорируете. Конечный результат тот же. Если thing.foo.bar существует, выполняется его код с его использованием. Если он не существует, то код не выполняется. Во всех случаях функция работает нормально.

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

Ответ 3

Проверка соединения:

   if (thing.foo && thing.foo.bar) {
      ... thing.foor.bar exists;
   }

Ответ 4

Просто проверьте его, прежде чем перейти к своей функции. Итак, вы передадите:

thing.foo ? thing.foo.bar : undefined