javascript si condición con múltiples ifs

I'm running a UI component on every page and on one of the pages, there's an extra functionality linked to it. The UI component has a boolean called MyValue and the extra functionality has an object called ExtraObject and one of its properties is a boolean called ExtraBool.

I want to test if MyValue is true AND if ExtraObject.ExtraBool is false, BUT ONLY if ExtraObject exists. That way, if I'm on the pages that don't have ExtraObject, there's no error.

Intenté esto:

if (MyValue === true && 
    (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {...}

¿Cómo debo reescribir esto?

At the moment, I keep getting "ExtraObject is not defined error".

Gracias.

preguntado el 12 de junio de 12 a las 21:06

You don't really need to compare the boolean values to true y false; simplemente refiérase a la variable o su complemento lógico (!ExtraObject.ExtraBool) -

@Pointy, although I doubt someone having problems with low-level boolean logic would run into this, it's possible that MyValue necesita ser true pero podría tener valores alternativos como 1 o el 'false', donde sería necesario realizar una comparación de igualdad estricta. -

parece que a OP le falta un pariente cercano en el if declaración... -

4 Respuestas

Eso debería ser:

typeof ExtraObject === "undefined"

typeof devuelve el tipo de la expresión como un cadena, entonces necesitas comparar el nombre "undefined" al resultado.

En mi opinión, su condición es demasiado explícita. Yo iría con algo más corto:

if (MyValue && !(ExtraObject && ExtraObject.ExtraBool)) {...}

Si se está comunicando con su propio código GUI, puede suponer que los tipos son los esperados. La verificación de tipos en JavaScript es bastante engorrosa, por lo que si sabe con lo que está tratando, puede ser menos explícito. (Sin embargo, esto no se aplica a la entrada del usuario. Nunca confíes en la entrada del usuario).

Respondido el 12 de junio de 12 a las 22:06

¡Por supuesto! Gracias por la respuesta. - frenchie

Se corrigió nuevamente, por lo que la condición se evalúa como true if MyValue es verdad y ExtraObject es indefinido. Tuve que revisar tu comentario sobre las otras respuestas para verificar. - Mattias Buelens

"si MyValue es verdadero Y si ExtraObject.ExtraBool es falso, PERO SOLO si existe ExtraObject" - frenchie

De todos modos, la solución que proporcionó para probar undefined entre comillas es buena. Prefiero un código largo que sea fácil de leer y luego, al final, lo paso por el compilador de cierre de Google y optimizo el resultado. - frenchie

Otra forma sería simplemente probar ExtraObject === undefined, but then you might want to locally redefine undefined to make sure it's actually undefined. - Mattias Buelens

The logic is not quite correct:

if (MyValue && ExtraObject && !ExtraObject.ExtraBool) { ... }

Supongo que null seria un valor ExtraObject shouldn't have either; that is, I presume that you r condition is really better stated that it should be a reference to an object.

Por lo tanto, la condición como la escribí será verdadera cuando MyValue is "truthy", ExtraObject es una referencia a un objeto real, y la propiedad ExtraBool on that object is "falsy".

Sometimes it's necessary to make explicit comparisons to boolean constants, but in my opinion it's a code smell. (Of course, it can also be dangerous to just check truthiness/falsiness ...)

editar If your requirement is that the expression be true when MyValue es verdad y ya sea ExtraObject no es una referencia a un objeto or es ExtraBool property is true, then I'd write that:

if (MyValue && (!ExtraObject || !ExtraObject.ExtraBool)) { ... }

Which is "better" is a matter of personal preference and experience.

Respondido el 12 de junio de 12 a las 21:06

no, if ExtraObject is undefined and MyValue === true then the condition is met - frenchie

Bueno, @frenchie está bien, pero tu pregunta está redactada incorrectamente. - Puntiagudo

¿donde? "si MyValue es verdadero Y si ExtraObject.ExtraBool es falso, PERO SOLO si existe ExtraObject" - frenchie

There's no "or" in your wording; I agree however that it's not incorrect, but it is ambiguous, because it's not clear what the "BUT ONLY" part relates to. - Puntiagudo

la parte "PERO SOLO" se relaciona con ExtraObject: estamos probando ExtraObject.ExtraBool === falso SOLO si existe ExtraObject. - frenchie

¡Hora de la mesa de la verdad!

A es MyValue*
B es window.ExtraObject**
C es ExtraObject.ExtraBool

A B C | O
------+--
0 0 0 | 0
0 0 1 | 0
0 1 0 | n/a***
0 1 1 | 0
1 0 0 | 1
1 0 1 | n/a***
1 1 0 | 1
1 1 1 | 0

Lo que encontramos con estos valores es que la ecuación más simple de producir O es:

A && !C

Entonces tu código debería ser:

if (MyValue && !ExtraObject.ExtraBool) {}

But of course, you mentioned not wanting to run into issues if ExtraObject no estaba definido:

var extraBool = window.ExtraObject ? ExtraObject.ExtraBool : false;
if (MyValue && !extraBool) {}

An alternative means of writing extraBool es:

var extraBool = window.ExtraObject && ExtraObject.ExtraBool;

You can then inline this:

if (MyValue && !(window.ExtraObject && ExtraObject.ExtraBool)) {}

An alternative of writing !(a && b) is !a || !b, Lo que significa que:

if (MyValue && (!window.ExtraObject || !ExtraObject.ExtraBool)) {}

también es correcto.

* it could be MyValue===true dependiendo de lo estricto que tengas que ser
** alternativamente typeof ExtraObject !== 'undefined'
*** en realidad no es posible tener ExtraObject be undefined and access ExtraObject.ExtraBool

Respondido el 13 de junio de 12 a las 00:06

ok, thanks! I looked at it and I think your way of doing it is better than what I was doing with the "undefined" test. I upvoted your answer. - frenchie

NO, actually your answer doesn't work in "strict mode". So my idea of working with the "undefined" test was actually good! - frenchie

@frenchie, oh right, forgot to set it as window.ExtraObject, in which case it will work just fine. - zzzzBov

AH YES! Global variables pollute the global scope for a reason. Thanks! - frenchie

if ((MyValue === true) && (typeof ExtraObject === undefined || ExtraObject.ExtraBool === false)) {}

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.