2010-04-06 13 views
5

me encontré con este trozo de código (modificado) en nuestra aplicación, y estoy confundido a como funciona:AND Javascript objetos juntos

function someObject() 
    { 
     this.someProperty = {}; 
     this.foo = 
     { 
      bar: 
      { 
       baz: function() { return "Huh?" } 
      } 
     }; 

     this.getValue = function() 
     { 
      return (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) || null; 
     } 
    } 

    function test() 
    { 
     var o = new someObject(); 
     var val = o.getValue(); 
     alert(val); 
    } 

cuando se llama a la función de prueba(), el texto "¿Eh? " es alertado No estoy seguro de cómo el resultado de getValue que está regresando, yo he pensado hacer un & & & & B C D & & habría vuelto verdadera, más que el valor de D.

+0

Se solucionó el ejemplo anterior. :) – Jonas

Respuesta

10

Eso sucede porque el Boolean Operators en JavaScript puede devolver un operando, y no necesariamente una Boolean resultado, por ejemplo:

el operador lógico AND (&&), devolverá el valor del segundo operando si el primero es Truthy:

true && "foo"; // "foo" 

y ha de devolver el valor del primer operando si es por sí mismo Falsy:

NaN && "anything"; // NaN 
0 && "anything"; // 0 

Es por eso que en su ejemplo se devuelve "Huh?", porque todas las expresiones anteriores son Truthy:

alert("A" && "B" && "C" && "Huh?"); // "Huh?" 
alert(true && true && true && "Huh?"); // "Huh?" 

El operat OR lógico o (||) tiene un comportamiento similar, devolverá el valor del segundo operando, si el primero es Falsy:

false || "bar"; // "bar" 

y devolverá el valor del primer operando si es por sí mismo no Falsy:

"foo" || "anything"; // "foo" 

Este comportamiento se utiliza a menudo para fijar valores predeterminados, por ejemplo:

function test (arg1) { 
    arg1 = arg1 || "default value"; 
} 

Nota: valores Falsy son los que coaccionan a false cuando se utiliza en un contexto booleano, y son: null, undefined, NaN, 0, cadena de longitud cero, y por supuesto false. Cualquier otra cosa forzará al true.

+0

esto puede solucionar su problema: !! (this.someProperty && this.foo.bar && this.foo.bar.baz && this.foo.bar.baz()) tenga en cuenta el "!!" –

+1

En una nota relacionada, la existencia de esta pregunta aquí es evidencia de que el uso de estos atajos sintácticos booleanos para la lógica debe considerarse mala forma ... "Di lo que quieres decir", dijo la liebre de marzo. – dkamins

+1

Excelente resumen de javascripts a menudo malentendidos operadores! –