Глубокая проверка Javascript, если она не определена без TypeError - PullRequest
9 голосов
/ 11 августа 2011

Я устал писать что-то вроде

if (
  typeof Foo != 'undefined' &&
  typeof Foo.bar != 'undefined' &&
  typeof Foo.bar.baz != 'undefined' &&
  Foo.bar.baz == 'qux'
) {...}

В PHP это немного лучше:

if (!empty($foo['bar']['baz']) && $foo['bar']['baz'] == 'qux') {...}

В идеале это будет:

function u(value) {
    return (typeof value != 'undefined') ? value:null;
}
if (u(Foo.bar.baz) == 'qux') {...}

Но браузер показывает «TypeError», когда я пытаюсь это сделать.Есть ли способ сделать функцию "и"?

Ответы [ 3 ]

5 голосов
/ 11 августа 2011

Вам не нужно явно указывать неопределенное.Проверка может быть что-то вроде:

if(foo && foo.bar && foo.bar.obj && foo.bar.obj.prop1)

Или у вас может быть блок try catch для перехвата при наличии ошибки:

try
{
  if(foo && foo.bar && foo.bar.obj && foo.bar.obj.prop1)
    {}
}
catch(e)
{
 alert(e);
}

Но да, я вижу проблему.Я бы посоветовал попытаться избежать глубокого вложения, как у вас.

2 голосов
/ 11 июня 2018

Для решения этой проблемы я использую Lodash _.get .

if(_.get(Foo, ['bar','baz'] === 'qux') doThings()

Если Foo.bar или Foo.bar.baz не определены, вы не получите ошибку типа, и ее немного легче читать и отлаживать.

0 голосов
/ 11 августа 2011

Поскольку вы предполагаете, что каждый шаг в вашей цепочке является объектом, а не 0, "" или логическое значение false, вы можете написать:

if (
 Foo  &&
 Foo.bar &&
 Foo.bar.baz &&
 Foo.bar.baz == 'qux'
) {...}

Но ведь лучше не иметь таких глубоко вложенных объектов

...