Estoy cansada de escribir algo como

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

En PHP es un poco mejor:

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

Idealmente sería:

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

Pero el navegador muestra "TypeError" cuando intento hacer esto. ¿Hay alguna forma de hacer que "u" funcione?

10
luchaninov 11 ago. 2011 a las 15:05

4 respuestas

La mejor respuesta

No tiene que indicar lo indefinido explícitamente. El cheque puede ser algo como:

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

O puede tener un bloque try catch para detectar si hay algún error:

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

Pero sí, puedo ver el problema. Sugeriría intentar evitar la anidación profunda como lo ha hecho usted.

6
Lemmings19 15 ago. 2013 a las 22:06

Como supone que cada paso en su cadena es un objeto y no 0 "" o booleano falso, puede escribir:

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

Pero después de todo, es mejor no tener objetos anidados tan profundos

-1
Andreas Köberle 11 ago. 2011 a las 12:31

Para resolver este problema, uso Lodash _.get.

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

Si Foo.bar o Foo.bar.baz no están definidos, no obtendrá un error de tipo, y es bastante más fácil de leer y depurar.

3
drj 11 jun. 2018 a las 19:34

Hay un nuevo operador de encadenamiento opcional en JavaScript. A partir de 2020, solo funciona en la versión más reciente de los navegadores populares. Así que recomiendo usarlo solo con transpiladores.

if (Foo && Foo?.bar?.baz == 'qux') {...}
2
Peter Ambruzs 11 feb. 2020 a las 15:46